设计集合数据库

时间:2014-08-04 21:01:03

标签: sql database-design nosql

我正在试图弄清楚如何实现包含集合的数据库。

元素可以是三种类型,简单的基本元素,那些元组甚至是元组(当然还有那些元组)。

它开始觉得几乎不可能。

我的第一种方法是使用两个元素表,这些元素也可能包含具有ID,Name和potentail第二个元素的集合以形成元组:

| elemtID | elementName | is_set | element_to_the_right |
  0         a             false    null                    // (a)
  1         a             false    0                       // (a,a)
  2         a             false    1                       // (a,a,a)
  3         A             true     null                    // the set A
  4         B             true     3                       // the set BxA

上面的行显示了如何制作元组(a,a,a)以及一些集合A

要指定成员船,我简单地有一种以下形式的邻接表:

| elemtID | setID |
  0         3      // a <- A

其中两个ID都指向第一个表中的elemID。

这个想法是模拟有限集的类别,我希望能够拥有任意深度的嵌套集,这需要递归和可能非常高级的查询。

为了摆脱这种局面,我一直在寻找具有更灵活架构的mongoDb等替代品。但由于它们不支持连接,我必须在一个集合中包含所有内容,而我无法真正地围绕它。

现在我想知道是否有替代设计或数据库模型。 任何评论都会有所帮助

此致,托比亚斯

1 个答案:

答案 0 :(得分:0)

看起来你需要类似的东西:

enter image description here

考虑:

  • 这实际上非常类似于文件系统(没有文件夹的硬链接)的描述方式。 SET类似于&#34;文件夹&#34;和ELEMENT到&#34;文件&#34;。集合可以具有一个或零个超集以及零个或多个子集(递归地)。集合也可以包含零个或多个元素。
  • 同名的两个元素不能属于同一个集合(由复合键{SET_ID,ELEMENT_NAME}强制执行)。
  • 所有集都被视为&#34;元组&#34;从某种意义上说,它们的元素是有序的({SET_ID,ELEMENT_ORDER}上的复合键是什么)。 IS_TUPLE只是告诉你是否忽略(FALSE)该命令(TRUE)。从这个意义上说,不仅集合可以包含元组,也可以包含副节点。其他设计可能会被禁止,但我并不想让事情复杂化。
  • 您可能需要也可能不需要ELEMENT表 - 取决于元素是否包含一些应该可以在多个集合中共享的其他数据。

您可以通过简单的方式获取同一个set / tuple的所有(直接,非递归)元素:

SELECT * FROM ELEMENT WHERE SET_ID = <whatever>

与子集非常相似。

但是,以递归方式获取所有元素将需要递归查询(WITH子句,如果您的DBMS支持它),或者需要对每个集合级别进行连续查询。

然而,除了&#34;邻接列表&#34;上面描述的模型,有一些替代方案可以提供不同的性能特征或减少递归查询的需要 - 看看this presentation by Bill Karwin