3

Я хочу связать и элемент в любом городе, стране или стране в моей базе данных. Тем не менее, я хотел бы иметь только одно поле в таблице «items», чтобы сделать ссылку на город, штат или страну, к которой он связан (вместо трех записей «city_id», «state_id» и 'cOUNTRY_ID'). См. Изображение:Об ассоциациях с несколькими таблицами (База данных)

Я знаю, что есть трюк по размещению таблиц между ними, но я искал и до сих пор не нашел этот шаблон.

Большое спасибо!

J

Database modeling

ответ

1

Как вы говорите, вы можете использовать промежуточную таблицу:

CREATE TABLE regions (
region_id INT NOT NULL AUTO_INCREMENT, 
country_id INT NOT NULL, 
state_id INT, 
city_id INT, 
PRIMARY KEY (region_id), 
UNIQUE KEY (country_id, state_id, city_id) 
CONSTRAINT FOREIGN KEY (country_id)   REFERENCES countries (id), 
CONSTRAINT FOREIGN KEY (country_id, state_id) REFERENCES states (country_id, id), 
CONSTRAINT FOREIGN KEY ( state_id, city_id) REFERENCES cities ( state_id, id) 
) 

Вы должны были бы сохранить эту таблицу regions обновляется с каждым возможным (страны, государства, город), включая штат или город NULL.

+0

Хотя это нормализовано, оно ничего не делает, кроме добавления нового 'JOIN' к каждому запросу ... Но вы правы, похоже, это то, о чем просил OP. – rid

+0

@eggyal: Мне пришлось сосредоточиться на другой части системы, но я скоро вернусь к этому. Я уже поддержал ваш ответ, но я буду считать его принятым, если это то, что я буду делать, иначе я обновлю этот поток, чтобы показать, что я сделал. Благодаря! – Jeremie

1

Рассматривали ли вы добавление пятой таблицы: place. Каждый country, state и city - это place. Каждый item связан с place.

Это еще не нормировано. Вы должны выполнить работу по обеспечению того, чтобы наборы значений place в трех таблицах не пересекались. У вас также есть больше работы для присоединения item к соответствующей таблице. (По сути, вы торгуете одним набором трудностей для другого.)

0

Вот еще одна идея, скажите мне, что вы думаете.

Поскольку поля в «пункта» будет необязательным, и что отношения между странами, говорится & городов уже определен, может быть, я мог бы попробовать этот способ:

первичные ключи стран, государства & города будет уникальным идентификатором через все эти три таблицы (например: ни один идентификатор штата не будет иметь тот же первичный ключ, что и любой город или страна).

Тогда я мог бы поместить этот уникальный идентификатор в таблицу «items», а также «тип», который даст таблицу, где его искать («города», «государства», «страны»).

Так как могут быть некоторые изменения (например, «регионы», «континенты» и т. Д.), То, возможно, было бы лучше просто «добавить» новую таблицу и тип вместо регенерации ассоциативной таблицы.

Имеет ли смысл?

Спасибо!