我正在为社交网站设计数据库,其中包含“追随者”和“跟随”功能,如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和用户名的表来获得性能优势?
答案 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层中强制执行此操作,具体取决于您的系统)。显然,这也意味着你永远不会双管齐下。
这相对简单,易于查询,并且应该在uid1
和uid2
上具有良好的复合唯一索引,具有良好的性能。搜索关于关系的非方向性信息时,您不必查看两个方向的索引。
编辑2:根据this,您可以通过将NOT NULL列设置为NULL来拒绝trigger中的插入。两个uid都应该是NOT NULL,所以如果uid1 >= uid2
,你可以将其设置为NULL。