gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:12:54 25 4
gpt4 key购买 nike

我正在为社交网站设计数据库,具有“关注者”和“关注”功能,例如 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)。但它可能是什么?

编辑


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

最佳答案

我会按照你的方式做:

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

这显然可能包含类似 followDate 的信息这在两个方向上都是有意义的。

那么你还可以:

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

relationId人工 key (可以是 INT AUTOINCRMENT、GUID 等)

但是,Connected 会有一个约束(是否可以在数据库层强制执行此操作取决于您的系统)uid1 < uid2 。显然,这也意味着你永远不会两全其美。

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

编辑:我建议用户使用人工 key 。即使您现在不允许更改用户名,您也可能希望稍后再这样做。

编辑2:根据this ,您可以拒绝 trigger 中的插入通过将 NOT NULL 列设置为 NULL。两个 uid 都应该为 NOT NULL,因此您只需将其中一个设置为 NULL if uid1 >= uid2 .

关于mysql - 无法找出正确的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8200721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com