Bri*_*ian 7 database-design relational-theory
我正在创建一个数据模型来存储与生产跟踪相关的数据。我在一家工程公司工作,为我们的客户建模和分析数据。这个过程有几个步骤,而且这个过程是不断更新的。
我正在尝试对流程进行建模并包括父流程和流程的顺序。
例如:
Process Table
---------------------
ProcessID - uniqueidentifier
ProcessName - varchar
ProcessDescription - varchar
...
ProcessOrder Table
---------------------
ProcessID - uniqueidentifier FK - Process
ParentProcessID - uniqueidentifier FK - Process
ProcessOrder - int
...
Run Code Online (Sandbox Code Playgroud)
中的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
Run Code Online (Sandbox Code Playgroud)
该ProcessOrder
表将如下所示:
ProcessID | ParentProcessID | ProcessOrder
--------------------------------------------------
UUID2 | UUID1 | 1
UUID3 | UUID1 | 2
UUID4 | UUID1 | 3
Run Code Online (Sandbox Code Playgroud)
这种设计的问题在于,当工作流更新时,流程顺序将发生变化,我将需要更新已ProcessOrder
更改流程的记录以及具有相同ParentProcessID
.
有没有更好的方法来存储这种数据并保持规范化?
你的设计对我来说似乎很合理。虽然在添加或删除新流程时您确实必须更新所有后续记录,但这很容易完成。您只需发布如下更新:
UPDATE ProcessOrder
SET ProcessOrder = ProcessOrder+1
WHERE ProcessOrder >= [step# where you want to insert]
Run Code Online (Sandbox Code Playgroud)
然后进行插入或删除。
我能想到的唯一其他方法是设计架构来存储行上的下一个进程 ID。就像是:
ProcessID | ParentProcessID | NextId
--------------------------------------------------
UUID2 | UUID1 | UUID3
UUID3 | UUID1 | UUID4
UUID4 | UUID1 | NULL
Run Code Online (Sandbox Code Playgroud)
然后,如果您插入一个新步骤(例如在 UUID3 和 UUID4 之间),您将执行更多链接列表操作,该操作会将 UUID3|UUID1 的 NextId 更新为 UUID5,然后仅插入 NextId 为 UUID4 的新 UUID5。
在大多数情况下,这会将 UPDATE 减少到 1,但它会使查询过程变得更加困难,因为现在您必须从上到下遍历列表才能逐步列出。
您需要决定您想要支持哪个过程 - 插入、更新或检索。如果您喜欢检索(如果更改不频繁且报告频繁且列表很短,您可能会这样做),那么请采用您的原始设计。如果您喜欢插入和更新(如果变化一直在发生并且报告很少发生,或者列表真的很长,那么您可能会这样做),那么请使用链表方法。
我希望这有帮助。对社区可能提出的其他解决方案感兴趣,因为我很想拓宽我的知识范围!