0

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

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

例如:

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

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

表中的ProcessOrderProcessOrder将简单地存储一个数字,该数字表示它所代表的父进程中的哪个顺序步骤。

例如,一个建模过程有以下步骤:创建新的空模型,命名模型,输入模型参数。该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更改流程的记录以及具有相同ParentProcessID.

有没有更好的方法来存储这种数据并保持规范化?

4

2 回答 2

0

我认为该解决方案类似于我在Advise on database design for a project生命周期中提出的解决方案

上面的数据是针对前面示例中描述的不同状态值的。因此,对于每个客户项目,您都有下表:

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

b) 状态更改 - 跟踪从一种状态到另一种状态的更改 - projectid - 旧状态(FK 到 ProcessID) - 新状态(FK 到 ProcessID) - 更改日期 - 注释(以及其他列,如批准等)

于 2012-07-07T10:35:28.360 回答
0

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

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

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

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

选择这个时问题来了。天真的方法是在表上递归地自连接。这将导致 N 个连接。

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

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

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

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

比较两种方法

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

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

于 2012-11-15T15:35:56.003 回答