Страницы

Поиск по вопросам

понедельник, 10 декабря 2018 г.

Нормализация базы данных из 4 таблиц

Всем привет. Как правильно связать левую таблицу с группой из 3ех таблиц справа? Только вот получается связать методом представленным на 2ом изображении
Например, пользователь выбирает конкретную марку, модель и поколение автомобиля, и его выбор (марка, модель, поколение) требуется записать в другую таблицу.
create table CarBrend( [BrendID] int identity (0,1) not null, [Title] nvarchar(max) not null, constraint PK_BrendID primary key ([BrendID]) )
create table CarModel( [ModelID] int identity (0,1) not null, [BrendID] int not null foreign key references CarBrend([BrendID]), [Title] nvarchar(max) not null, constraint PK_ModelID primary key ([ModelID]) )
create table CarGeneration( [GenerationID] int identity (0,1) not null, [ModelID] int not null foreign key references CarModel([ModelID]), [Title] nvarchar(max) not null, [StartProduction] date not null, [EndProduction] date not null, constraint PK_GenerationID primary key ([GenerationID]) )
create table Car( [CarID] int identity (0,1) not null, [BrendID] int not null foreign key references CarBrend([BrendID]), [ModelID] int not null foreign key references CarModel([ModelID]), [GenerationID] int not null foreign key references CarGeneration([GenerationID]), constraint PK_CarID primary key ([CarID]), )
Я сомневаюсь в правильности 4ой таблицы (Car). Подскажите, как правильно поступить в данном случае.
В первой таблице CarBrend содержится марка автомобиля Nissan (и другие марки). В второй таблице CarModel содержится модель Primera марки Nissan (и другие модели). В третьей таблице CarGeneration содержаться все поколения Nissan'а Primer'ы - P10, P11-120, P11-140, P12 (и других). А в таблице Car(4) объединяются записи со всех 3х предыдущих таблиц (чтобы сформировать полную машину).


Ответ

БД не должна позволять внести в себя противоречивые данные. Это основной принцип проектирования. Второй предложенный вами способ, т.е с тремя полями у машины, позволяет создать одну машину бренда Мерседес и конкретной модели Mercedes W140 и другую машину, так же модель Mercedes W140, но поставить ей бренд Жигули. Значит такая БД сама напрашивается на внесение в нее некорректных данных.
Второй принцип проектирования - простота изменения одной сущности. предположим мы ошиблись и отнесли модель W140 к бренду жигули. создали несколько таких машин, спохватились и решили исправить бренд. В первом случае нам надо только менять бренд у конкретной модели. А во втором еще и пробежаться по всем машинам и поменять бренд у них.
Если посмотреть теорию проектирования, то второй вариант, с тремя ссылками, нарушает третью нормальную форму
Следовательно у машины должна быть только ссылка на ревизию модели и более ни на что. это позволит как избежать внесения несогласованных данных так и обеспечит принцип изменения одной сущности в одной таблице. Так что верна ваша первая картинка.

Комментариев нет:

Отправить комментарий