Я пытаюсь сделать что-то вроде дизайна базы данных для тегов, за исключением того, что каждый из моих тегов сгруппирован в категории.
Например, допустим, у меня есть база данных об автомобилях. Допустим, мы на самом деле мало что знаем о транспортных средствах, поэтому мы не можем указать столбцы, которые будут иметь все транспортные средства. Поэтому мы будем «маркировать» автомобили информацией.
1. manufacture: Mercedes
model: SLK32 AMG
convertible: hardtop
2. manufacture: Ford
model: GT90
production phase: prototype
3. manufacture: Mazda
model: MX-5
convertible: softtop
Теперь, как вы можете видеть, все автомобили помечены своим производителем и моделью, но другие категории не совпадают. Обратите внимание, что у автомобиля может быть только один автомобиль каждой категории. IE. У автомобиля может быть только один производитель.
Я хочу создать базу данных для поддержки поиска по всем Mercedes или иметь возможность перечислить все производители.
Мой текущий дизайн выглядит примерно так:
vehicles
int vid
String vin
vehicleTags
int vid
int tid
tags
int tid
String tag
int cid
categories
int cid
String category
У меня есть все необходимые первичные и внешние ключи, за исключением того, что я не могу справиться со случаем, когда у каждой машины может быть только один производитель. Или я могу?
Могу ли я добавить ограничение внешнего ключа к составному первичному ключу в vehicleTags? IE. Могу ли я добавить такое ограничение, что составной первичный ключ (vid, tid) может быть добавлен в VehicleTags только в том случае, если в VehicleTags еще нет строки, так что для того же vid еще нет tid в с тот же сид?
Думаю, нет. Я думаю, что решение этой проблемы - добавить столбец cid в vehicleTags и создать новый составной первичный ключ (vid, cid). Это выглядело бы так:
vehicleTags
int vid
int cid
int tid
Это помешало бы автомобилю иметь двух производителей, но теперь я продублировал информацию о tid в cid.
Какой должна быть моя схема?
Том заметил эту проблему в моей схеме базы данных в моем предыдущем вопросе Как выполнить внешние соединения таблиц "многие-ко-многим"?
РЕДАКТИРОВАТЬ
Я знаю, что в этом примере производитель действительно должен быть столбцом в таблице транспортных средств, но допустим, вы не можете этого сделать. Это всего лишь пример.