【问题标题】:MySQL - setting foreign keys with composite pattern (mapping multiple tables to one map)MySQL - 使用复合模式设置外键(将多个表映射到一个映射)
【发布时间】:2012-01-12 11:43:10
【问题描述】:

我正在设置一个应用程序数据库,但我很难设置外键。基本设计涉及三个表:users、clients 和contact_map。用户有客户。用户和客户都有多个电话和电子邮件帐户。联系地图包含这些。它有 UserID、UserType、Key、Value。

UserID=来自客户端或用户表的 ID。 UserType=enum('用户', '客户') 键/值=电话或电子邮件地址键/值对。

我正在尝试做的事情是否可行,如果可以,您是如何做到的?

这是我尝试过的,但没有成功。

CREATE TABLE CONTACT_MAP
...
CONSTRAINT 'ContactMap_Users'
    FOREIGN KEY ('UserID', 'UserType' )
    REFERENCES USERS ('ID')
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT 'CONTACT_MAP_CLIENTS'
    FOREIGN KEY ('UserID', 'UserType )
    REFERENCES CLIENTS ('ID')
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

【问题讨论】:

  • 您是否尝试使用CONTACT_MAP 表来表示用户和客户之间的关系(它是 1:N 还是 M:N)?或者,CONTACT_MAP 是否真的独立于用户和客户可能拥有的任何关系?
  • 这与他们的关系无关。这只是为了让用户和客户拥有多个电话号码、电子邮件地址、facebook、google+、twitter 帐户。

标签: mysql database-design foreign-keys


【解决方案1】:

写下 FOREIGN KEY 约束时,子表中的字段数需要与您尝试从父表中引用的字段数相匹配。所以,你可以写...

FOREIGN KEY (UserID) REFERENCES USERS (ID)

...或...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID, UserType)

...但不是...

FOREIGN KEY (UserID, UserType) REFERENCES USERS (ID)

您不能真正使用UserType 来“选择”正确的外键。避免这种需要的一种方法是模拟继承并且只有一个外键:

对此的实体关系术语是“类别”(参见ERwin Methods Guide,部分:“子类型关系”)。类别符号为:

【讨论】:

    【解决方案2】:

    这是不可能的。外键只能应用于单个“外部”表。

    考虑如果您在“代理”和“客户”中有一条记录都引用了 ContactMap_Users 中的相同记录,会发生什么情况。您已将它们设置为无操作,但让我们假设它们已设置为级联。不,如果您删除CLIENTS 中的父记录,DBMS 将按照外键删除contactmap_users 中的子记录...现在ACTIONS 中的另一个父记录悬空...

    更新也是如此。您更新了ACTIONS 中的记录,该记录级联到此映射表,现在 CLIENTS 中的父记录悬空。

    【讨论】:

    • 对不起,代理是用户(我认为如果我更改它会更容易让其他人联系)。我可以将它们分成两个相同的表,但宁愿使用列“enum('user','client') 来区分两者。有点像继承或复合模式。两组不同的数据共享同一个表.
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2018-11-28
    • 2018-12-21
    • 2021-09-11
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多