1
4
Quassnoi 在嵌套集模型和邻接列表模型上运行了一些性能测试,并在他的博客文章中记录了结果和建议。 Adjacency list vs. nested sets: MySQL . 执行摘要是:
本文的其余部分将展示如何定义表、实现查询并给出性能度量。使用空间索引是一个聪明的主意,它可以提高嵌套集模型的性能,而嵌套集模型对您来说可能是新的。 如果你也在考虑不使用MySQL的方法,那么你可能想看看 PostgreSQL 这是另一个免费的开源数据库。PostgreSQL支持以下形式的递归查询: recursive common table expressions 这使得查询继承数据比在MySQL中更容易,并且提供了更好的性能。Quassnoi还写了一篇文章 Adjacency list vs. nested sets: PostgreSQL 这显示了细节。
在我们讨论其他方法时,Oracle的数据库也值得一提。Oracle还具有自定义扩展名
|
2
2
我总是和 嵌套集合 为了剪切简单方便。我总是建议 this article . 它突出显示了使用此类层次结构数据所需的查询。我在这里看到的唯一缺点是,当层次结构达到一定的复杂性时,插入/更新新记录的速度会变慢,但读取速度比我见过的许多其他解决方案都要快。 举个例子:
在SQL方面,我认为它不能得到任何更漂亮、更简单的东西;) 我不知道 存储过程 方式。但是,由于它涉及递归(在您的情况下),我不知道它在层次结构中的许多级别上是否会很快。I assume you can give it a try. |
3
1
也许你应该考虑使用面向文档的数据库,比如 MongoDB . 它可以让你的生活更轻松。 |
4
1
在处理分层数据集时,我发现最好考虑缓存。以这种方式处理这个问题的主要好处之一是不需要将数据库反规范化为可能难以改变的内容。
由于内存堆(memcache、redis等)的查找速度比简单的SQL快得多。
若要添加/删除新节点,只需使其“直接父缓存”无效。
如果速度不够快,可以将另一层缓存添加到每个节点的所有子节点的列表中。为了使用适当可变的数据集,您应该记录每个节点的缓存性能(刷新/缓存命中率),并为何时存储缓存设置一个公差级别。这也可以存储在内存堆中,因为它是非重要数据。
如果您使用这个更高级的缓存模型,您需要注意这些完整的子节点列表在其任何子节点发生更改时都需要失效。
|
5
-1
I once had to store a complex hierarchical arbitrary-depth bill-of-material system in a SQL-like database manager that wasn't really up to the task, and it ended up forcing messy and tricky indicies, data definitions, queries, etc. After restarting from scratch, using the db manager to provide only an API for record reads and writes on simple indexed keys, and doing all of the actual input/manipulation/reporting in external code, the final result was quicker to implement, easier to understand, and simpler to maintain and enhance. The most complex query needed was essentially SELECT A FROM B. 因此,不要将逻辑和操作嵌入到MySQL的限制中,而是考虑使用代码来做您想要做的事情,并且仅依赖于最低级别的get/put。 |
hello_programmers · Mysql从其他表输出一列 1 年前 |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 1 年前 |
Kugelfisch · 用php为数据库加密数据 1 年前 |