假设我有三个桌子。我将使这些表尽可能简单,以说明设计问题:
使用者:
CREATE TABLE users (user_id INT PRIMARY KEY);
网络:
CREATE TABLE networks (network_id INT PRIMARY KEY);
网络用户:
CREATE TABLE network_users (
network_id INT,
user_id INT,
PRIMARY KEY(network_id, user_id),
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
如上所示,用户与网络之间具有多对多关系,如“网络用户”表中所述。到目前为止,这都是非常常规的。
现在这是我的问题:
假设我想添加一个消息表,并且希望能够存储发送到以下消息的消息:
一个特定的用户,
特定的网络
或网络中的用户
消息表的最佳设计方法是什么?
我可以这样构造一个消息表:
CREATE TABLE messages (
message_id INT PRIMARY KEY,
network_id INT,
user_id INT,
FOREIGN KEY(network_id) REFERENCES networks(network_id),
FOREIGN KEY(user_id) REFERENCES users(user_id)
);
哪里:
发送给特定用户的消息的user_id字段已设置,network_id字段为NULL
发送到特定网络的消息具有network_id字段,而user_id为NULL
发送给网络内用户的消息同时设置了network_id和user_id字段
但这是最好的方法吗?由于network_id和user_id字段可能为null,因此与使用复合主键(network_id和user_id的复合主键)不同,我必须创建一个单独的主键(message_id)。
最佳答案
您在问题中描述的内容称为多态关联。看一下this article,其中描述了一些可能的建模方法。
尽管本文描述了如何以最通用的方式为多态关联建模,但我认为您的方法也不错,因为大多数情况下消息类型不会多于3个(对于用户,对网络以及对一个网络)
关于mysql - 设计与表A,表B或表A和B相关的SQL表的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44121123/