Я пытаюсь сделать что-то вроде Дизайн базы данных для тегов , за исключением того, что каждый из моих тегов сгруппирован по категориям.
Например, допустим, у меня есть база данных об автомобилях. Допустим, мы на самом деле не очень много знаем о транспортных средствах, поэтому мы не можем указать столбцы, которые будут иметь все транспортные средства. Поэтому мы «помечаем» транспортные средства информацией.
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?
Я думаю, нет. Я думаю, что решение этой проблемы - добавить столбец cid в vehicleTags и создать новый составной первичный ключ (vid, cid). Это будет выглядеть так:
vehicleTags
int vid
int cid
int tid
Это предотвратит появление у двух производителей автомобиля, но теперь я продублировал информацию о том, что находится в cid.
Какой должна быть моя схема?
Том заметил эту проблему в моей схеме базы данных в моем предыдущем вопросе, Как вы делаете много-много внешних табличных объединений?
EDIT
Я знаю, что в примере изготовления действительно должна быть колонка в таблице транспортных средств, но допустим, вы не можете этого сделать. Пример только пример.