【问题标题】:How to model an attribute with ordered states?如何对具有有序状态的属性进行建模?
【发布时间】:2014-03-18 09:51:00
【问题描述】:

处理具有有序状态的属性是我处理过很多次的事情。例如,问题跟踪器中的问题可以具有openpendingclosed 状态。为了使排序和查询更容易,将状态存储为整数是很诱人的。但是,这使得添加新状态变得不那么简单了吗?例如,新状态 delayed 介于 pendingclosed 之间,当状态存储为整数时会出现问题。

是否存在使用可排序类型(例如整数)在不影响可扩展性的情况下存储问题状态的模式或概念?

想到的一种方法是避免使用后续值。与其将0 分配给open 和将1 分配给pending,不如将​​10 分配给open20 分配给pending 可能会更好,以便为可扩展性留出空间。这是一种常见的模式吗?

【问题讨论】:

  • 不要使用单个整数来表示状态和顺序。
  • 迈克,他显然指的是某些工作流/过程(/ petri 网?)中的状态排序。您如何使用任何无序类型来表示此排序?您是否建议在其他地方明确建模可能状态的可能顺序(二元关系“状态 X 先于状态 Y”)?即明确地将类型的相关排序运算符定义为数据库中的表?
  • @ErwinSmout:我只是建议排序顺序有自己的列。

标签: database-design data-modeling


【解决方案1】:

我认为使用具有一定偏移量的整数(如 10、20、...)只是一种 hack,但没有针对您的问题的一般概念解决方案。

一般的解决方案是使用具有两个正整数值属性(如 enumNoseqNo)的类(如 State),一个用于为 (State) 枚举文字提供标识符,还有一个用于定义线性顺序。

【讨论】:

    【解决方案2】:

    BASIC 在七十年代就已经应用了。

    【讨论】:

    • 你能详细说明你的答案吗?您指的是我在问题中提到的方法吗?
    • BASIC 对行进行了编号,默认情况下它们编号为 10、20、30,...因此在现有行之间插入行相对容易。它还有一个 RENUMBER 命令(这在许多情况下也是必要的功能,这是该模式的大多数其他应用程序都没有实现的,但在许多用例中也可能不方便实现)。这看起来像你的问题吗?
    • BASIC 或 COBOL 行编号与数据建模和数据库设计无关
    • BASIC 源代码的行与其他任何东西一样多的“数据”。即使只对编译器/解释器。因此,他们同样可以像其他任何事情一样进行“建模”练习。
    【解决方案3】:

    编辑: 排序模式不会出现在关系模型中,因为它违反了第一范式和关系定义。非关系型数据库模型使用 List 或 Array 数据结构来定义排序。

    【讨论】:

    • 没有询问您对什么应该是对问题建模的正确方法的意见。问题是关于被视为某些处理引擎数据的事物的交错编号模式。
    • @Erwin Smout 这不是我的意见,根据定义,排序模式不会在关系模型中退出,请参阅维基百科en.wikipedia.org/wiki/First_normal_form
    • "非关系数据库模型使用列表或数组数据结构来定义排序。"关系数据库模型允许通过包含一个名为的属性来对事物的排序进行建模,例如"ORDINAL" 或 "ORDER" 并将其值设置为 1,2,3,... 或 10,20,30,... 在构成数据库的元组和关系中。
    • @Erwin 可以通过多种方式在关系数据库中实现持久排序,但它是应用程序级模型,例如ORM 实现支持到 List、Enum 的映射,但它不是数据建模或数据库设计范围。实现排序的简单方法是“权重”属性,它可能对某些特定应用程序很重要,但在应用程序中计算排序值的权重应该更好。
    猜你喜欢
    • 2011-06-16
    • 2012-07-21
    • 1970-01-01
    • 2019-04-06
    • 2022-11-23
    • 1970-01-01
    • 2010-12-30
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多