可更新顺序记录的数据库设计

时间:2012-06-07 15:53:22

标签: database database-design relational-database

我正在创建一个数据模型,用于存储与生产跟踪相关的数据。我在一家工程公司工作,为我们的客户建模和分析数据。该过程有几个步骤,并且该过程不断更新。

我正在尝试对流程进行建模,并包括父流程和流程的顺序。

例如:

Process Table
---------------------
ProcessID - uniqueidentifier
ProcessName - varchar
ProcessDescription - varchar
...

ProcessOrder Table
---------------------
ProcessID - uniqueidentifier FK - Process
ParentProcessID - uniqueidentifier FK - Process
ProcessOrder - int
...

ProcessOrder表中的ProcessOrder列只会存储一个数字,表示它代表的父进程中的哪个连续步骤。

例如,建模过程包括以下步骤:创建新的空模型,名称模型,输入模型参数。 Process表格如下:

ProcessID | ProcessName | ProcessDescription
-------------------------------------------------
UUID1     | Modeling    | Create Model of Data
UUID2     | New Model   | create new empty model
UUID3     | Name Model  | name model
UUID4     | Parameters  | enter model parameters

ProcessOrder表格如下:

ProcessID | ParentProcessID | ProcessOrder
--------------------------------------------------
UUID2     | UUID1           | 1
UUID3     | UUID1           | 2
UUID4     | UUID1           | 3

此设计的问题是,当工作流程更新时,流程订单将发生变化,我将需要更新已更改的流程的ProcessOrder记录以及具有相同{{1的所有后续记录}}

是否有更好的方法来存储此类数据并维持规范化?

2 个答案:

答案 0 :(得分:0)

我认为解决方案类似于我在Advise on database design for a project lifecycle

提出的解决方案

以上数据适用于上一个示例中描述的不同状态值。因此,对于每个客户端项目,您都有以下表格:

a)客户项目 - Clientid - 对客户的引用 - 状态(FK到ProcessID) - 项目名称,描述,开始日期

b)状态更改 - 跟踪从一种状态到另一种状态的更改 - projectid - 旧状态(FK到ProcessID) - 新状态(FK到ProcessID) - 日期改变了 - 备注(以及批准等其他栏目)

答案 1 :(得分:0)

问题类似于LinkedLists具有更好的插入性能(假设您已经有对要插入的节点的引用)与ArrayList中的插入相似的原因。

在进行插入时,在ArrayList中,您必须移动所有记录以为新插入腾出空间。假设N个记录(假设在列表的开头插入),这可能需要O(N)时间。

在LinkedList中,您只需要在要插入的位置更新节点。根据上面的假设,这将花费O(1)时间,因为您只需要更新Prev节点和Next节点。

要在数据库中设置LinkedList结构,而不是ProcessOrder列,您将拥有两列,PrevProcessID和NextProcessID。

选择此问题时会出现问题。天真的方法是在桌面上递归地自我加入。这将导致N个连接。

不使用N个连接,不要使用任何连接,并选择具有父ID的所有进程。

在代码中,拥有一个包含以下字段的Process对象: ParentProcessID 的ProcessID PrevProcessID NextProcessID

在读取select中的记录时,创建这些对象并将它们存储在HashTable中,并将ProcessID作为键。这将花费O(N)时间来遍历select语句。

现在记录在HashTable中,您可以通过查找表中的NextProcessID(或PrevProcessID)轻松地从一个节点移动到另一个节点。使用HashTable可以避免进行N个连接,而是需要花费O(N)时间进行设置。

比较两种方法

1)您现在拥有的当前解决方案。这是一个ArrayList类型的解决方案(将ProcessOrder视为索引)。插入需要O(N)时间,同时节省了读取时间,因为您不必设置HashTable。但是,如果您已经循环遍历返回的记录以设置实体对象,那么这将与LinkedList解决方案中的设置时间相同。

2)我建议的解决方案。这是LinkedList类型的解决方案。假设您知道要插入的位置,插入需要O(1)时间。设置时间需要O(N)时间。