好友关系用数据库怎么存?

2020-05-07 06:17:23 +08:00
 pinews
A 和 B 是好友,数据库存一条记录,

查询 A 的好友时,有这条记录,
查询 B 的好友时,也有这条记录,

怎么表达这种相等的关系?
我能想到的是存 2 条记录,

之前的九九乘法歌是举例
5032 次点击
所在节点    数据库
40 条回复
ksaa0096329
2020-05-07 06:19:11 +08:00
图数据库
btnokami
2020-05-07 06:21:21 +08:00
sparql 和 gremlin 了解一下
pinews
2020-05-07 06:21:55 +08:00
或者用 OR,感觉都不是我想要的
pinews
2020-05-07 06:25:37 +08:00
@ksaa0096329
@btnokami 对的对的,就是这种,谢谢。
pinews
2020-05-07 06:29:05 +08:00
用 mysql 能实现类似功能吗?
lbfeng
2020-05-07 06:31:09 +08:00
@pinews associate table 实现 many to many
catror
2020-05-07 06:37:09 +08:00
单独建一个好友关系表,存一条记录就可以了,查询的时候同时检查两个字段。
lihongming
2020-05-07 06:47:22 +08:00
建议分别存两条,原因有二:


从产品上讲,你将来很可能会需要单向关注,而不是双向好友,分别存储就不用大改。


从技术上讲,sns 是个典型的 nosql 应用场景,每次读取时间线都重新计算效率太低,不如每个用户存自己关注和关注自己的人,发动态时更新所有人的时间线。这样可以用队列等方式把服务器的空闲时间利用起来慢慢写入,而读取时间线就只需要读一条记录,效率极高。
pinews
2020-05-07 06:58:05 +08:00
@lihongming 好友关系只是举例,只用来描述是或不是的关系,表示一种绝对等价的关系。
lihongming
2020-05-07 07:10:34 +08:00
@pinews 坦率地说,你的问题没法回答。


学的越多,越明白系统设计需要跟业务特征紧密结合,凭空出题根本没法设计
luopengfei14
2020-05-07 07:14:59 +08:00
如果是做 im,好友关系复杂,例如出现备注、设置免打扰、拉黑等,单独见表,互为好友对应两条记录。
如果好友关系简单,一条记录就可以
areless
2020-05-07 07:25:16 +08:00
存两条,关注~被关注。你要是单向关注就把 timeline 推过去会被用户打死的
pinews
2020-05-07 07:28:07 +08:00
@lihongming 就是一本小说,人物之间的各种关系,选中一个人,就可以查看和他所有有关系的人,挨个点下去,就能看到所有人的关系,就像看地图一样,图数据库,挺形象的,两个人的关系可能和复杂,会做详细说明,但是不去区分方向。就相比兄弟,不去区分谁是兄谁是弟,是夫妻,不区分谁是夫谁是妻,他们的关系会具体的详细另外再写。
guoshim
2020-05-07 07:28:10 +08:00
这种是很典型的图关系。
如果你希望数据库本身支持复杂的图操作,可以用图数据库。
如果你希望短平快一点,延迟低一点,就正常的 mysql 或者 kv store 就可以了,分两部分来存,一个用来存点,即用户,另一个存边,即某两个用户之间的关系。当然,如果数据量很大,或者有非常高频的访问,可以再搞一层 memcache 。
pinews
2020-05-07 07:33:35 +08:00
@guoshim 好的,我去学习一下
pinews
2020-05-07 07:48:52 +08:00
我其实是想做一个兴趣 知识 计划之类的工具,比如我关注了 linux 这个点,但是这个知识点太大,我只能记录和我有关的几点内容,后来我又关注了 debian,又记录了 debian 的几点内容,其中特别关注了 linux 和 debian 共同,与其他不同的东西,然后又关注了 apache,我又想和 windows 下的 apache 对比一下,就是这样的知识点。

和 tag 很像,但是也重视不同 tag 的联系的这种关系,好比我喜欢有山的画,喜欢有水的画,喜欢又有山又有水还有花的画,如果没有看到这的画我可能想不起来,但是看到这样的画,我就想找到更多这样的画,但又不想贸然去找一个组合,很可能什么都找不到会觉得很失望。...不知道自己在说些什么。。
pinews
2020-05-07 07:52:33 +08:00
@pinews 所以我暂时先把那些感兴趣的知识点记录起来,然后看看打算去想哪个兴趣点去更适合拓展。
pinews
2020-05-07 07:57:18 +08:00
就想一个知识地图,全局来看,看看哪里长时间不关注,可能需要学习吗,放大详细了看,看看哪里知识不够完备,专业。这样好做规划。
foam
2020-05-07 08:27:28 +08:00
#16 扫雷?
yvestang
2020-05-07 08:34:37 +08:00
图数据库适合你,定义好 schema 即可,推荐下 janusgraph (重)或者百度的 hugegraph 或者社区版本的 neo4j

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669118

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX