gpt4 book ai didi

SQL数据库设计问题

转载 作者:行者123 更新时间:2023-12-04 14:40:45 24 4
gpt4 key购买 nike

我目前正在努力解决数据库设计问题,我将展示一个简化的场景:

假设我有四个表,Equipment、CurrentState、StateValue、StateType,具有以下模式:

Equipment
------------
Id (PK),
Name


CurrentState
------------
Id (PK),
EquipmentId (FK) (IX),
StateValueId (FK),
StateTypeId (FK) (IX)


StateValue
------------
Id (PK),
StateTypeId (FK),
Name


StateType
-----------
Id (PK),
Name

一件设备可以有几个属于不同 StateTypes 的不同 CurrentStates,因此有唯一索引 (IX)。 StateType 基本上是一个状态机,StateValue 包含每个状态机的值。

现在,我的问题,还有 2 个问题,是围绕 CurrentState 和 StateValue 表中的 StateTypeId 外键确定 CurrentState 记录是什么 StateType 以及 StateValue 记录是什么 StateType。

首先,就参照完整性而言,拥有这种类型的关系是不是糟糕的设计?我的猜测是这是一个糟糕的设计,因为 CurrentState 表和 StateType 表之间应该只有一个链接,这是通过 StateValue 实现的,否则 CurrentState 记录最终可能有两种不同的 StateTypes(一个通过直接 FK 和其他通过 StateValue 表 FK)...

但是第二个问题来了:如果我不应该在 CurrentState 表中有一个 StateTypeId FK,我该如何强制执行索引,即确保单个 EquipmentId 没有两个 CurrentState 记录具有指向 StateValue 记录的 StateValueIds相同的 StateType...

插入 CurrentState 表时是否必须使用触发器来检查规则是否得到遵守?我以前从未使用过触发器,所以我需要做一些研究。我也在使用 Entity Framework 并且不知道这有什么影响(理论上不应该有任何影响)。

最佳答案

是的,这是一种不好的做法,因为一个当前值可以有两种不同的状态类型。将 StateTypeId 列从 CurrentState 中删除,让它只通过 StateValueId。您的唯一索引应该在 CurrentStateStateValueId 上。

当然,如果您坚持要在 CurrentState 中包含 StateTypeId,您可以设置一个 check 约束以确保 StateTypeId 等于 StateValueId 中的 StateTypeId。但这真的很迂回。将它们全部放在自己的孤岛中会更干净、更易于维护。

关于SQL数据库设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1231075/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com