假设我有三个桌子。我将使这些表尽可能简单,以说明设计问题:

使用者:

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/

10-11 10:46