在 SQL 数据库中,表示任意排序集的唯一方法是为每条记录赋予一个“顺序”,每次更新或移动此顺序中的项目时,您都必须更新或以某种方式维护整个等级列表每晚工作或类似的东西。
例如,我可以[C, B, D, A]
在 SQL 数据库中以这种方式表示有序集:
ID Name Order
1 A 4
2 B 2
3 C 1
4 D 3
如果我想将一个项目移动到集合中的不同位置,或者添加一个新项目,我可能需要更新很多项目。一般来说,这种方法有很多维护开销。
查询数据库中的数据对 SQL 来说不是问题,问题是重新排序集合的显着维护开销。SQL 中没有简单的操作可以将项目移动到集合中的新位置。排序是任意的和用户定义的。
我意识到这可以使用 SQL 来完成,执行某些操作(如前置项目或将项目移动到新位置)非常笨拙。即使是这个颠倒集合顺序的示例操作也需要相当冗长、复杂的查询。我正在寻找的数据库类型可能本身就支持这样的操作,或者至少更优雅。
所以,如果我正在设计一个非常涉及有序集的应用程序(例如 Trello),那么 SQL 似乎不是我理想的数据库技术。是否有任何数据库的语法以更自然的方式支持有序集?
这些是来自 Cassandra 文档的一些 CQL3 查询,它们似乎与我正在寻找的内容很接近。这将一个项目添加到有序集合中。
UPDATE users SET top_places = [ 'the shire' ] + top_places WHERE user_id = 'frodo';
这个将设置集合中位置 2 的项目的值。我怀疑我可以使用它来轻松执行任意交换/重新排序。
UPDATE users SET top_places[2] = 'riddermark' WHERE user_id = 'frodo';
不幸的是,文档还指出
虽然我们将来可能(或可能不会)稍微放宽该规则,但这仍然意味着集合并不意味着过大。它们不能替代对表格进行适当的建模。
这似乎表明有序集在 CQL3 中还不是(还)一等公民。
我认为您缺少关系数据库设计的关键原则之一。我以为是 EF Codd 博士,但我找不到参考资料。
数据存储时不排序,检索时排序。这是为了避免在每次更新或插入时重新排序数据的开销。
当您选择数据时,排序是通过 order by 子句完成的。
一些供应商存储按聚集索引排序的数据这一事实有点误导。如果必须对数据进行排序,则应始终使用 order by 而不是依赖底层存储。
由于您必须有一些排序标准,为什么不将其合并到您的查询中,以便在您每次选择数据时查询数据时对其进行排序。
大多数主要的关系 DBMS 都支持 XML 或 JSON 形式的结构化类型。这些是保序的。通常,相应的编程语言(T-SQL、PL/SQL)将具有内置功能来操纵这些类型,就像 SQL 操纵列和行一样。
一些关系存储还支持 ARRAY 数据类型(一个示例)。无论数组的其他部分发生什么情况,一个项目都将保留其与相邻项目的前后关系。与 JSON 不同,数组本身不能包含复杂类型,因此可能需要持有代理 ID 数组并按需提取剩余数据。
如果您选择采用结构化类型,为什么不全力以赴并使用围绕它们设计的 DBMS。这是NoSQL的领域。有许多产品,每种都有优点和缺点。
最后我要提一下图形存储。他们的技巧是关注项目的关联性。这适用于有序列表,因为定义特征是一个项目如何跟随另一个项目。因此,可以将项目建模为具有边的图形节点,特别是“跟随”边,以所需顺序链接节点。
在或多或少地使用了这些方法之后,我认为它们在应用程序编程方面的工作量都没有显着减少,包括您不喜欢的直接 SQL 方法。
在我看来,这些有序集不是任意排序的,而是根据某些特征排序的,即时间、日期、大小等。
如果您对这些特征中的每一个都有一个字段,您只需使用特征字段的索引查看数据集。
我希望我没有遗漏任何东西,但我在你的问题中没有看到任何表明这种“标准方法”不是你需要的东西。