Я пытаюсь сделать что-то вроде Database Design for Tagging, за исключением того, что каждый из моих тегов сгруппирован по категориям.
Например, скажем, у меня есть база данных об автомобилях. Скажем, мы действительно мало знаем об автомобилях, поэтому мы не можем указать колонки, которые будут иметь все транспортные средства. Поэтому мы будем "маркировать" транспортные средства информацией.
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 только в том случае, если в транспортной таре еще нет строки, так что для того же vid нет тот же cid?
Мое предположение - нет. Я думаю, что решение этой проблемы - добавить столбец cid в VehicleTags и создать новый составной первичный ключ (vid, cid). Это будет выглядеть так:
vehicleTags
int vid
int cid
int tid
Это помешало бы автомобилю иметь двух производителей, но теперь я продублировал информацию, которая имеет значение cid.
Какова должна быть моя схема?
Том заметил эту проблему в моей схеме базы данных в моем предыдущем вопросе, Как вы делаете много для многих внешних внешних таблиц?
ИЗМЕНИТЬ
Я знаю, что в примере производство действительно должно быть колонкой в таблице автомобилей, но пусть говорят, что вы не можете этого сделать. Примером может служить только пример.