我想将数据库中的城市,州或国家/地区和项目关联起来。但是,我想在'items'表中只有一个字段来链接到它所关联的城市,州或国家(而不是有三个条目'city_id','state_id'和'COUNTRY_ID')。见图:
我知道有一个把桌子放在两者之间的技巧,但是我搜索了但仍然没有找到那种模式。
非常感谢!
Ĵ
答案 0 :(得分: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
的位置。
答案 1 :(得分:1)
您是否考虑过添加第五个表:place
。每个country
,state
和city
都是place
。每个item
都与place
相关联。
这仍未正常化。您必须确保三个表中的place
值集不相交。您还需要做更多工作才能将item
加入相应的表格。 (基本上,你为另一个人交换了一套困难。)
答案 2 :(得分:0)
这是另一个想法,告诉我你的想法。
由于“项目”中的字段是可选的,因此国家,州和国家之间的关系是可选的。城市已经定义,也许我可以尝试这样:
各国,各州及各州的主要关键通过所有这三个表格,城市将是唯一的ID(例如:没有州名称ID将与任何城市或国家/地区条目具有相同的主键)。
然后我可以将这个唯一的ID放在“items”表中以及“type”中,这样可以让表格在哪里查找('cities','states','countries')。
由于可能会有一些变化(例如:'region','continents'等),那么可能最好简单地“添加”一个新表并输入而不是重新生成关联表。
有意义吗?
谢谢!