我正在创建一个数据模型,用于存储与生产跟踪相关的数据。我在一家工程公司工作,为我们的客户建模和分析数据。该过程有几个步骤,并且该过程不断更新。
我正在尝试对流程进行建模,并包括父流程和流程的顺序。
例如:
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的所有后续记录}}
是否有更好的方法来存储此类数据并维持规范化?
答案 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)时间。