在关系数据库中保持实体顺序的最佳模式是什么?

What is the best pattern for persisting entity order in a relational database?

环境:ASP.NET 带 EF 的 MVC 应用程序(数据库优先,控制数据库设计)和 Sql 服务器。

我有很多具有用户生成属性的实体。我需要一种方法让用户能够指定这些元素的顺序。

稍微详细一点:用户可以创建一个 "template",然后他们可以将 "properties" 添加到其中。这些 "properties" 需要订购。还有 >= 4 种其他不同的实体类型也需要用户指定的排序。

我对此的前端方面没有问题,但我想知道在 sql 服务器中保持元素顺序的最佳方法是什么。

对我来说显而易见的解决方案是给每个实体一个列 "Order"(或另一个非关键字名称),并在重新排序时(例如,将元素 #4 移动到 #2)更新所有受影响的实体.

这是解决这个问题的最佳方法吗?

这听起来不像是一个小项目,您可能在 SortOrder 属性.

之上还有各种其他动态自定义项

向您的实体添加一个 SortOrder 列 table 当然不是一个坏方法,但是这种方法可能会用不一定属于该实体的信息阻塞您的数据(尤其是如果多个用户可以自定义相同的实例)。

所以我为您准备了一个替代方案:

  • CustomizationNode table(或类似的东西)添加到您的数据库

您在此处存储 SortOrder 和可能的其他类型的元数据和用户自定义项,它们不一定是概念实体的一部分。

然后,如果您需要 add/change/remove 任何自定义信息,您只需要在一个 table 中完成,而不是多个。 并且您无需在每次更改自定义功能时迁移您的实体。

根据您的情况,您可以 link 通过以下几种方式之一:

1。向每个实体 table

添加一列 CustomizationNodeId

这与对每个实体实例进行单个自定义有关,是最简单的解决方案。 也可以在相同类型(或什至不同类型,尽管这可能没有多大意义)的多个实体之间共享一个定制

2。添加多列 EntityXId, EntityYIdCustomizationNode table.

原则上,这些ID字段只填一个,其他为空。看起来有点"off",但不一定是错误的做法。

虽然您无法在同一类型的多个实体之间共享自定义项,但您可以获得每个实体多个自定义项和其他 FK(例如 UserID)的能力。这将允许您进行 per-user 自定义。

3。在每个 EntityXCustomizationNode

之间添加一个 link table

这是最复杂但也是最通用的解决方案。它包括为每个 table 添加一个带有 FK 的 table link。

您获得的一个重要好处是额外的解耦。定制和实体不知道彼此的存在和变化而不影响彼此。

此外,您可以向这些 link table 添加额外的元数据,这样您就可以在上面 1 和 2 中提到的所有内容之上进行版本控制。

底线是,如果您的应用程序是高度动态和可自定义的,那么您可能希望将 "metadata" 与实际的 "data".[ 分开存储=20=]