哪一个是为单个字段存储多个值的最佳方法?逗号分隔或单独表

时间:2013-02-13 14:02:54

标签: mysql database csv database-normalization

我想存储用户关注者和关注会员列表。现在为了这个,我想在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有什么缺点吗?或者还有其他有效的方法来处理这种情况吗?

2 个答案:

答案 0 :(得分: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子句展开这些查询以返回用户名。

答案 1 :(得分:3)

以上都不是。每个关注者一个 。规范化您的数据并使用它将很容易。让它像你提出的那样抽象混乱,随着你的应用程序的增长,你的生活会变得越来越艰难。