2011-08-29 69 views
0

我有章,分章,节的一本书的结构,款,第二十和subarticles的数目不详,分subarticles,分次subarticles等SQLite的结构建议

什么是结构的最佳方式? 一个表与子 - 父母关系,多个表?

谢谢。

回答

1

在关系数据库中有几种方法可以保存树结构。最常用的是使用父指针和nested sets

第一个数据结构非常简单,即指向每个对象上相应父元素的指针,因此易于实现。缺点是不容易对它进行一些查询,因为树不能完全遍历。您需要每层的自连接。

嵌套集更容易查询(当你已经理解它是如何工作的)但更难更新。许多写操作需要对树中的其他对象进行附加更新,这可能会使其更难以过渡保存。

第三个变体是materialized path,我个人认为这是前两者之间的一个很好的折衷。这就是说,如果你想存储任意大小的树(例如,对于节,子节,子节,...),你应该使用提到的树实现之一。如果您的最大深度非常有限(例如最多3层),则可以创建明确的数据结构。但因为事情总是比最初复杂得多,所以我建议你使用真正的树实现。

+0

谢谢,我稍后会看看链接。我确实需要遍历查询树。 – Francisc

4

要确定是否有单独的表格或涉及到一个大表格,您应该仔细查看每个项目 - 章节,子章节等 - 并确定它们是否与其他属性具有不同的属性。一章是否带有与子章不同的内容?

如果是这样,那么你正在查看章节,子章节,章节,子章节,文章的单独表格。文章对我来说依然感觉与你的次级子等分等。

如果不是,那么也许它是一张有父母/小孩的大桌子,但看起来你可能正在谈论'名字'表示层次的深度,这又让我再次偏向单独的表格。

另请考虑您将如何查询以及您将要搜索的内容。

+2

如果数据是相同的,但可能对于某种“级别标识符”,则将其设为一个递归表。如果有不同的数据 - 比如说,如果章节有单独的作者,但较低的层次没有,而文章有脚注但更高的层次不等,那么你需要不同的表格。我不会太教条,就像在一个层次上有一个额外的列,并且你可以无害地使其在其他层次上为空,好吧,保存在一个表中。但是,如果存在很多差异,那么他们确实是不同的实体。 – Jay

+0

谢谢,我唯一的问题就是如果我有一个像Parent-> child 1-> child 2-> child 3的东西,我如何选择孩子3的Parent作为例子。我需要用查询来做到这一点。 – Francisc