Sql 集合数据库的设计

Sql 集合数据库的设计,sql,database-design,nosql,Sql,Database Design,Nosql,我试图弄清楚如何实现包含集合的数据库 元素可以有三种类型,简单的基本元素,这些元素的元组,甚至是集合,当然还有这些元素的元组 开始觉得几乎不可能了 我的第一种方法是使用两个元素表,其中可能还包含ID、名称和第二个元素的集合,以形成元组: | elemtID | elementName | is_set | element_to_the_right | 0 a false null // (a) 1

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

元素可以有三种类型,简单的基本元素,这些元素的元组,甚至是集合,当然还有这些元素的元组

开始觉得几乎不可能了

我的第一种方法是使用两个元素表,其中可能还包含ID、名称和第二个元素的集合,以形成元组:

| 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

要指定成员ship,我需要一种如下形式的邻接表:

| elemtID | setID |
  0         3      // a <- A
两个ID都指向第一个表中的elemID

其思想是对有限集的类别进行建模,我希望能够拥有任意深度的嵌套集,这将需要递归的,可能是非常高级的查询

为了避免这种情况,我一直在研究其他替代方案,比如具有更灵活模式的mongoDb。但是因为他们不支持加入,我不得不把所有的东西都放在一个集合中,我真的不能对此束手无策

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


您好,Tobias看起来您需要类似的东西:

考虑事项:

这实际上与描述没有文件夹硬链接的文件系统非常相似。集合类似于文件夹,元素类似于文件。一个集合可以递归地有一个或零个超集和零个或多个子集。一个集合也可以有零个或多个元素。 相同名称的两个元素不能属于由复合键{set\u ID,ELEMENT\u name}强制执行的同一集合。 所有集合都被认为是元组,因为它们的元素是有序的,这就是{SET_ID,ELEMENT_ORDER}上的复合键的作用。IS_元组只是告诉您是否忽略该顺序的FALSE或not TRUE。从这个意义上说,不仅集合可以包含元组,还可以包含元组。其他的设计可能会被禁止,但我不想让事情复杂化。 您可能需要元素表,也可能不需要,这取决于元素是否包含应在多个集合之间共享的其他数据。 您可以通过以下简单方式获得同一集合/元组的所有直接、非递归元素:

SELECT * FROM ELEMENT WHERE SET_ID = <whatever>
子集合的情况非常相似

然而,递归地获取所有元素需要递归查询WITH子句(如果DBMS支持),或者对每个集合级别进行连续查询


但是,除了上面描述的邻接列表模型之外,还有一些替代方案可以提供不同的性能特征,或者缓解递归查询的需要。请看。

我看到您用标签标记了这个问题。您还会对关系解决方案感兴趣吗?不过,您不会轻易避免递归查询。@Branko Dimitrijevic——最明确的说法。我想构建的应用程序是自相关的。一些键值存储支持重复的键berkeleydb、hamsterdb。您可以使用它来建模1:n关系,即将setId存储为key,将多个elementId存储为records。我很感谢你花时间来回答,我认为你对元组问题的解决方案很好。但我不知道id如何能够使用此模型将集合用作其他集合中的元素。@user25470看到集合中的自引用FK了吗?每个子集合的父集合ID将等于超集的集合ID。根集合在父集合ID中有空值。这是表示层次数据的标准邻接列表方式-你会在我链接的演示文稿中找到非常相似的示例。老实说,我不能说我非常喜欢这个方案,它使元素,这应该是一般数量,先到具体,再到一般。但它满足了我的要求,我非常感谢你抽出时间。这很可能是因为没有办法将所有集合包含在有限的关系集合中,因为这些集合本身就是集合。