Я сделал что-то подобное для издателя, пытающегося прикрепить процедуры ремонта к продукту.Продукт идентифицируется первичным ключом из четырех частей: Год, Марка, Модель, Двигатель или YMME, и таблица транспортных средств выглядела так (упрощенно):
VEHICLES
year integer
make varchar
model varchar
engine varchar
Таблица PARTS должна быть связанак сущности в таблице ТРАНСПОРТНЫЕ СРЕДСТВА.Деталь может работать с определенным годом, маркой и моделью, но не тогда, когда установлен конкретный двигатель.
В вашем случае вам нужно решить, какое сочетание атрибутов однозначно идентифицирует велосипед.Если вы отслеживаете велосипеды от нескольких производителей, вам нужно сделать.Если вещи меняются из года в год, вам нужен ГОД.Если есть разница от модели к модели, вам нужна МОДЕЛЬ.Если, скажем, деталь будет работать, если рама алюминиевая, а не стальная, вам понадобится FRAME_MATERIAL или FRAME_GAUGE, вместо ENGINE, или вам понадобится отдельная модель для алюминия, другаядля стали.
VEHICLES
year
make
model
frame
Тогда вы могли бы просто иметь промежуточную таблицу:
VEHICLE_PARTS
partid integer foreign key references PARTS
year
make
model
frame
...
или
VEHICLE_PARTS
partid integer foreign key references PARTS
year
make
model (frame material is handled by a separate model)
Ваша структура должна ответить на вопрос:часть работы с этим велосипедом?Простое присутствие partid в таблице VEHICLE_PARTS должно подразумевать, Да, это так.Вы действительно хотите избежать наличия поля «Исключения» в таблице VEHICLE_PARTS, где есть некоторая удобочитаемая нотация, в которой говорится, что деталь несовместима с рассматриваемым велосипедом, когда используются рули барана.Вы действительно должны создать отдельную модель для таких вещей.