4

我想存储用户关注者和关注成员列表。现在为了做到这一点,我正在考虑在 USER 表中创建两列,即 FOLLOWING 和 FOLLOWER,以分别存储以下和关注者的逗号分隔值。

USER TABLE FIELDS:

userid
firstname
lastname
date_of_birth
following   //in this we store multiple following_id as comma separated
follower    //in this we store multiple follower_id as comma separated

另一种方法是创建表,即 FOLLOWER 和 FOLLOWING 来存储用户的关注者和关注成员的 ID。

USER TABLE FIELDS:

userid
firstname
lastname
date_of_birth

FOLLOWER TABLE FIELDS:

userid
follower_id (also is an user)

FOLLOWING TABLE FIELDS:

userid
following_id (also is an user)

由于我正在学习数据库设计,因此我没有足够的知识。所以,在这里我没有正确了解哪种方式是正确的?我已经搜索过使用逗号分隔的方式不是一个好主意,但同时它是使用 NF 拥有多个表的好方法吗?使用 JOINS 有什么缺点吗?或者有没有其他有效的方法来处理这种情况?

4

2 回答 2

4

您只需要两张表 - 一张列出您的users,一张列出每个用户是谁following

生成的表格将类似于您的第二个建议,除了该followers表格是不必要的,因为所有必需的数据都已经在following表格中 - 它只是从第二列而不是第一列键入。该表将需要列上的索引。

该表每个方向following每个关系应该有一行。如果用户互相关注,您将在表中放置两个条目。following

CREATE TABLE following (
    userid ... NOT NULL,
    following_id ... NOT NULL
);

CREATE INDEX idx_user ON following(userid);
CREATE INDEX idx_following on following(following_id);
CREATE UNIQUE INDEX idx_both ON following (userid, following_id); // prevents duplicates

要查找特定用户关注的 ID:

SELECT following_id FROM following WHERE userid = ?

或查找该用户的关注者:

SELECT userid FROM following WHERE following_id = ?

如果需要,请使用适当JOIN的子句来扩展这些查询以返回用户名。

于 2013-02-13T14:06:38.773 回答
3

以上都不是。每个追随者一行。规范化您的数据并轻松使用它。像你提议的那样把它变成一个抽象的混乱,随着你的应用程序的增长,你的生活将变得越来越艰难。

于 2013-02-13T14:03:56.790 回答