tyf_520 发表于 2018-10-22 09:21:52

【求问】怎么设计一个网状数据库

比如我想设计一个能够存储人物关系的数据库。
比如这样的(图随便找的)


几个条件:
人物数量不定
人物之间的关系连接数量不定
目前我想的是创建2个表:
其一,存储人物信息,以及人物相关的关系连接
字段:id, data, links
其二,存储每个关系连接,包括两端的2个人物,以及关系的描述信息
字段:id, p1, p2, data
但是,遇到了问题:
表一中之所以保存人物相关的关系连接,起初是为了满足这样的搜索需要:比如我想查小明与所有有关系的人的关系。这就有了2种方案:
第一种,不在表一存关系,而是通过where在表二中查询来获得,这样的话就会想使用索引,来提升查询速度。可是可能存在2个连接,它们的data不同,但p1与p2相同。也可能一个连接中存在方向性,比如父子,那么p1=父的id,p2=子的id。了解了所谓“聚集索引”,然而只能有一个的话,意味着“父子”连接我得写2行,父子 与 子父。对于这里,我就不知道该用什么索引类型比较好了,也不知道查询效率究竟如何。
于是想了第二种,在表一中存关系,存的是关系的id数组,这样就能迅速完成查询。可能以字符串存储,也可能以二进制存储。但这种方法我不知道数据库内部会怎么处理,因为这一字段会频繁修改,而当人物非常多时,意味着数组很长,那么每一次修改的量就很大,而且内容的长度还不确定。
请问对这样的数据库该如何设计呢

抢钱的靠边站 发表于 2018-10-22 09:11:44

昨天发太晚,自顶

tyf_520 发表于 2018-10-22 09:27:03

又想到了第三种方案,创建表三,作为表二的辅助表。
表三字段:id, p1
对于表二中,凡是具有方向性的连接,都在表三中建立一行,p1为表二中p2的值。然后表二表三均以自己的p1字段作为聚集索引,这样每次where查询就在表二与表三中分别执行一次。不知这样如何?

hoson 发表于 2018-10-22 09:41:45

这是僵尸吗?

hldgkdsd 发表于 2018-10-22 09:56:13

帮顶

KDaK_rkdehd 发表于 2018-10-22 09:56:14

子查连查不可以嘛

VWdDPTst 发表于 2018-10-22 10:11:58

小白一个 顶一下

dawenzi098 发表于 2018-10-22 10:43:43

neo4j了解一下。。

看隔壁用它做过网状的阅读笔记,很炫酷的样子。 而且也蛮方便的。。

图数据用传统的表数据来设计确实略纠结

ktfwlbv 发表于 2018-10-22 14:25:29

围观 围观 沙发在哪里!!!

prbshlq 发表于 2018-10-22 15:08:37

我也顶起出售广告位
页: [1] 2
查看完整版本: 【求问】怎么设计一个网状数据库