欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

祝贺Javaeye2.0, 关联数据结构

程序员文章站 2022-07-10 21:22:07
...
Javaeye2.0 社区的版面,感觉很不错。

我也在做一个数据关联结构的开源内容系统。
现在把核心数据结构写在这里,供参考,抛砖引玉。
文中的例子和说明,是和femto讨论的过程中加上的。

-----------------------------------------

我正在做一个内容组织整理的开源作品。

主要功能是:
能够让用户*指定homepage (或者其他任何属于自己的page)上显示什么内容,可以任意组织整理。
功能上相当于 CMS + 具有FTP功能的个人空间。

要达到这个目的,需要一个非常灵活的数据结构。all in one, cover all content formats。
我就把这个数据结构,写在这里,和大家讨论,也算是一个具体例子。
Entity 说明如下(用户相关信息省略):

1. Content.
这个Entity 很简单,主要具有一个 name 字段, 和 content 字段。
可以代表 blog, news, tag, directory, topic, thread, article, post, wiki item, etc.

2. Ref
所有的关系都在这里管理。content本身不具有任何关系。
Ref 要达到这样的功能,多对多。任意的 content 之间,都可以组装成父子关系。递归都没有关系。没有任何限制。

id,
target_id

id 就是一个 ref id, alias id.
target id 就是 content id.

3. Ref_relation.

parent_ref_id
child_ref_id

Ref + Ref_Relation 两个table,就可以表述所有的多对多关系。

---------

为什么不用一个 content_relation ( parent_content_id, child_content_id ) 表达多对多,非要多出一个Ref ?
这是为了按照ref提取一棵数据树.
如果只有content_relation,无法确定如何从这些关系中,提取某个确定组织的数据树。
这个理解起来不那么直观,可以思考几个*组织的例子。

举例,
几个论坛 bbs1, bbs2....
每个论坛都有 A, B, C 等分类。
每个分类都有 a, b, c, 等版块。
每个版块都有 topic
每个topic 都有 reply.

这是一个树形结构数据。

wiki 也是一个树形结构数据。


我设想的结构中,任何一个content item 可以出现在任何地方,多次出现。毫无限制。

比如,我有一个content item,叫做 "新世纪"

我想,让它成为 BBS1 下面的分类。

那么。Ref 数据
id,       target_id
1001,   bbs1
1002,   新世纪 

----------------------

ref_relation 数据
parent, child
1001 , 1001

----------------------

这样就可以了。
其实这个就是用来表达

parent, child
bbs1 , 新世纪

这个父子关系。
多出来一个Ref是为了提取数据的需要。
设想一个多层数据的例子,就会发现简单的 parent child 不够用。必须多出来一个Ref。

想想看这样的例子。
现在content table 就有一个 新世纪 记录。

现在需要构成一个这样的树形结构。

新世纪
|- 新世纪
.........|- 新世纪
.........|- 新世纪
................| - 新世纪
|- 新世纪

如何表达?用简单的parent child根本没有办法。
用ref就没有问题。

Ref数据
id,       target_id
1001,   新世纪
1002,   新世纪 
1003,   新世纪
1004,   新世纪 
1005,   新世纪
1006,   新世纪 

----------------------

ref_relation 数据
parent, child
1001 , 1002
1002,   1003
1002,   1004
1004,   1005
1001,   1006

----------------------


一个更具体的例子。写起来,太麻烦了。就不写了。:D 可以设想出来很多。

为了看起来方便,上面出现 新世纪 的地方。实际上是 新世纪 这个内容对应的 content ID。

数据核心结构就是这么多. 具体让它工作起来, 来需要更多的辅助数据结构. 比较繁琐, 不再赘述.

大家可能有更好的设计方案。
我把自己的基本设计写在这里,抛砖引玉。


femto:
可不可以把你的ref理解成alias,一个content可以有多个别名,这样可以在多个地方被引用?

my answer:
对阿。
ref引用就是alias的意思。
文件系统中的快捷方式link.
多个virtual node指向真正的node。