Посмотрев еще немного, я думаю, что вы правы, чтобы смоделировать год как присоединение многих ко многим.Я привел оба способа, просто чтобы показать в качестве примеров того, о чем я говорю.Если у вас есть атрибут, охватывающий всю модель в течение многих лет, например, класс автомобиля (эконом, грузовик, люкс и т. Д.), Вам потребуется таблица «многие ко многим» для нормализации и во избежание дублирования данных.
-- id did not use auto-incs as I am just showing the relational model
create table make(
makename varchar primary key
);
-- 1. many to many
create table model(
modelname varchar not null,
makename varchar not null references make(makename),
-- if carclass changes - one update changes every model/year combo
carclass varchar not null -- economy, suv, truck etc ...
primary key (makename, modelname)
);
create table model_year(
year integer not null,
modelname varchar not null references model(modelname)
baseprice integer not null
primary key (year, modelname)
);
-- 2. year /w/ model
create table model(
modelname varchar not null,
makename varchar not null references make(makename),
year integer not null,
-- update anomaly - you would have to update every model/year combo
carclass varchar -- economy, suv, truck etc ...
-- baseprice is OK since it is tied to the year
baseprice integer not null
primary key (makename, modelname, year)
);
... Таким образом, # 1 будет более «правильным» и надежным способом, особенно если вы планируете хранить атрибуты в модели, которые не зависят от того, в каком году она была сделана.В любом случае вы получите те же запросы.На самом деле, труднее / больше работать (не совсем после того, как вы его понизили), чтобы присоединиться к таблицам нормализованной таблицы, чем ненормализованной.Но это не главное.Вы помещаете в БД, потому что хотите, чтобы ваши данные были правильными (я надеюсь).
Примечание: это первичные ключи real , даже если вы используете первичные ключи auto-inc.Вы хотели бы изменить первичные ключи на уникальные, чтобы обеспечить согласованность данных и изменить ссылочные внешние ключи на целые.