无法找出正确的数据库设计

时间:2011-11-20 09:51:38

标签: mysql database-design database

我正在为社交网站设计数据库,其中包含“追随者”和“跟随”功能,如twitter。整个圈子都有一些共同的关系,即我跟随的人和我的追随者......我有一张桌子跟着uid1和uid2。假设A跟随B和B跟随A和C.它将具有类似

的条目
uid1 uid2
A      B
B      A
B      C

现在我想要在同一个表中的第三个字段relationId,它应该是一个关系的唯一,无论A跟随B还是B跟随A,

uid1 uid2  relationId
A     B      1
B     A      1
B     C      2 

这样我就可以在另一个表中使用relationId作为外键来存储用户整个圆圈共有的特征。 有一点我想到的是,如果有一个可交换的公式来获取给定两个数字(uid1和uid2)的唯一数字(relationId)。但它可能是什么?

修改


我还有一个疑问。由于我数据库中的用户名是唯一的。那么我是否应该在整个数据库中使用username作为主键,或者在我的情况下使用一个数字作为主键作为uid以及用于解析uid和用户名的表来获得性能优势?

1 个答案:

答案 0 :(得分:3)

我会这样做的方式类似:

Follows
-------
follower followed
A        B
B        A
B        C

显然,followDate这样的信息在两个方向都有意义。

然后你也可以:

Connected
-----------------
relationId uid1 uid2
x          2    3

使用relationId一个人工密钥(可以是INT AUTOINCREMENT,GUID等)

但是,Connected会有uid1 < uid2的约束(无论您是否可以在db层中强制执行此操作,具体取决于您的系统)。显然,这也意味着你永远不会双管齐下。

这相对简单,易于查询,并且应该在uid1uid2上具有良好的复合唯一索引,具有良好的性能。搜索关于关系的非方向性信息时,您不必查看两个方向的索引。

编辑:我建议为用户使用人工密钥。即使您现在不允许更改用户名,也可能希望稍后更改。

编辑2:根据this,您可以通过将NOT NULL列设置为NULL来拒绝trigger中的插入。两个uid都应该是NOT NULL,所以如果uid1 >= uid2,你可以将其设置为NULL。