【问题标题】:About associations with multiple tables (Database)关于与多个表的关联(数据库)
【发布时间】:2012-04-24 16:07:30
【问题描述】:

我想将项目与我数据库中的城市、州或国家/地区相关联。但是,我希望“项目”表中只有一个字段来链接到与其关联的城市、州或国家(而不是三个条目“city_id”、“state_id”和'country_id')。看图:

我知道在两者之间放置表格有一个技巧,但我搜索并没有找到那个模式。

非常感谢!

J

【问题讨论】:

    标签: mysql database database-design relational-database database-schema


    【解决方案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 所在的州或城市。

    【讨论】:

    • 虽然这是规范化的,但它只是在每个查询中添加一个新的 JOIN ......但你是对的,它似乎确实是 OP 所要求的。
    • @eggyal:我不得不专注于系统的另一部分,但我很快就会回到这一点。我已经赞成您的回答,但如果我将这样做,我会将其视为已接受,否则我将更新此线程以显示我所做的。谢谢!
    【解决方案2】:

    您是否考虑过添加第五个表:place。每个countrystatecity 都是place。每个item 都关联到一个place

    这仍然没有标准化。您必须确保三个表中的place 值集是不相交的。在将item 加入相应的表时,您还有更多工作要做。 (本质上,您将一组困难换成另一组。)

    【讨论】:

      【解决方案3】:

      这是另一个想法,告诉我你的想法。

      由于“项目”中的字段是可选的,并且国家、州和城市之间的关系已经定义,也许我可以尝试这样:

      国家、州和城市的主键将是所有这三个表中的唯一 ID(例如:没有州 ID 与任何城市或国家条目具有相同的主键)。

      然后我可以把这个唯一的 ID 和“类型”放在“items”表中,这会给表在哪里查找它('cities'、'states'、'countries')。

      由于可能会有一些变化(例如:'regions'、'continents'等),那么最好简单地“添加”一个新表和类型,而不是重新生成关联表。

      有意义吗?

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-10-20
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多