在关系数据库中持久化实体顺序的最佳模式是啥?

Posted

技术标签:

【中文标题】在关系数据库中持久化实体顺序的最佳模式是啥?【英文标题】:What is the best pattern for persisting entity order in a relational database?在关系数据库中持久化实体顺序的最佳模式是什么? 【发布时间】:2018-08-16 07:06:19 【问题描述】:

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

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

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

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

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

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

【问题讨论】:

是的,这是一个好方法。您可以将“attr desc”保存在一列中,或者将 order 属性和方向保存在单独的列中。在查询中,您包含此保存的排序 我也喜欢下面的答案。但是请不要将列命名为“Order”,它是 sql server 中的关键字。如果您使用关键字作为列名,则会在尝试编写查询时产生所有类型的语法挫折。 我相信这是个好方法。 @user7396598 哈,谢谢你的提醒。我将其更改为SortOrder 以防止给未来的读者带来潜在的麻烦:) 【参考方案1】:

这听起来不像是一个小项目,您可能在 SortOrder 属性之上还有其他各种动态自定义。

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

所以我有一个替代的想法给你:

CustomizationNode 表(或类似的表)添加到您的数据库中

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

然后,如果您需要添加/更改/删除任何自定义信息,您只需在一个表中执行此操作,而不是在多个表中。 而且您无需在更改自定义功能时迁移实体。

根据您的情况,您可以通过以下几种方式之一链接它们:

1。为每个实体表添加单列CustomizationNodeId

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

2。将多个列EntityXIdEntityYId 添加到CustomizationNode 表中。

原则上,这些 ID 字段中只有一个会被填写,其他字段将为空。可能看起来有点“不对劲”,但不一定是错误的做法。

虽然您无法在同一类型的多个实体之间共享自定义项,但您可以为每个实体拥有多个自定义项和其他 FK,例如 UserID。这将允许您对每个用户进行自定义。

3。在每个EntityXCustomizationNode 之间添加一个链接表

这是最复杂但也是最通用的解决方案。它体现了为您希望链接的每个表添加一个带有 FK 的表。

您获得的一个重要好处是额外的解耦。自定义和实体不知道彼此的存在和更改,而不会相互影响。

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

底线是,如果您的应用程序是高度动态且可自定义的,那么您可能希望将“元数据”与实际“数据”分开存储。

【讨论】:

感谢您的回答。我现在将使用 SortOrder 列。用户之间的顺序不会改变,也不会因为任何其他原因而改变。如果在某些时候我需要额外的定制,我认为调查您提出的替代解决方案之一是有意义的。 [编辑删除不推荐使用的信息]

以上是关于在关系数据库中持久化实体顺序的最佳模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

jpa是啥,和hibernate类似?

VS2015 + SQL Server 反向生成实体模型

软考-后篇

在关系数据库中存储(和访问)历史 1:M 关系的最佳方式是啥?

hibernate对象的三种状态是啥?

数据库设计模型实体关系图n实体与1:m实体的关系 - 最佳实践