我遇到了一个问题,而我的ERD正常化-这是我的第一次这样做,所以请容忍我。
我有三个桌子:Users
;Clients
;和Messages
。它们之间关系的基数如下-
Users:Clients
是 mn- Each user may have one or more clients.
- Each client may have one or more users.
Users:Messages
是1:n- Each user may send one or more messages.
- Each message may only be sent by one client.
Clients:Messages
是1:n- Each client may send one or more messages.
- Each message may only be sent by one client.
据我所知,我必须创建一个关联表来解决Users
和Clients
之间的mn关系:假设我称之为表user_client_list
。我知道来自Users
和Clients
的两个PK现在将在user_client_list
中成为FKs,但是的PK将是一个新分配的ID计数器。
另外,在解析Clients:Messages
和Users:Messages
1:n关系时,我将以Messages
表中的外键client_id
和user_id
结束。这在我看来有点奇怪-,这是正确的练习吗?我是不是漏掉了什么?
发布于 2015-03-25 00:30:12
(将我的评论升级为回答)。
Users
和Clients
之间的mn关系:假设我称之为表user_client_list
。我知道来自Users
和Clients
的两个PK现在将在user_client_list
中成为FKs,但是的PK将是一个新分配的ID计数器。您可以在user_client_list
中创建一个ID计数器并使其成为您的PK,但这通常并不是必要的:除非完全相同的关系可能多次存在,否则PK可能只是两个FKs的混合物,例如(user_id, client_id)
。
Clients:Messages
和Users:Messages
1:n关系时,我将以Messages
表中的外键client_id
和user_id
结束。这在我看来有点奇怪-,这是正确的练习吗?我是不是漏掉了什么?更典型的方法是将Users
和Clients
组合成单个表,比如People
,其中的列标记记录是代表用户还是客户端;那么Messages
表将只有一个FK进入新的People
表。
采用这种方法可能会遇到一个问题,那就是user_client_list
关联表可以承认不受欢迎的用户-用户关系和客户-客户机关系。防范这种错误的关系是业务逻辑的一部分,通常是在应用程序代码中实现的,但如果愿意的话,可以在MySQL中使用触发器强制执行。
在INSERT ON user_client_list之前创建触发器user_client_list如果(从用户选择输入id = NEW.client_id) <> ' client‘,则向SQLSTATE '45000’设置MESSAGE_TEXT =‘提供的client_id不代表客户端类型的人’;
https://stackoverflow.com/questions/29245688
复制