如何在数据库级别的 table 中强制执行记录之间的依赖关系
How to enforce dependencies between records within a table on database level
我有一个数据库table,例如:
----[Statuses]----
StatusID
Name
------------------
以数据为例:
----[Statuses]----
1
Quote created
2
Quote accepted
3
Quote sent
4
Quote confirmed
5
Quote declined
-------------------
现在我想在界面中将其显示为多项选择,因此所有这些记录都带有复选框-但是,某些选项不是多项选择,例如 'Quote confirmed' 和 'Quote declined' 不能同时为真。
最大的问题是这个 table 是可变的 - 用户可以添加更多状态 - 否则我可以创建触发器。
我如何在记录级别上执行这种规则?有没有办法通过向此 table 添加 1 个或多个列来使其工作?
编辑:
我将针对我的问题添加更完整的设计:
还有一个table,比如:
---[Projects]---
ProjectID
Projectname
Projectcode
Projecttype
----------------
为了记录用户选择的内容,需要一个路口table:
------------------[Projects_Statuses]---------------
ProjectID
StatusID
DateChecked (date when the user clicked the status)
UserChecked (user that clicked the status)
-----------------------------------------------------
加入 tables
可能会产生以下结果
SELECT *
FROM Projects_Statuses PS
INNER JOIN Statuses S ON PS.StatusID = S.StatusID
INNER JOIN Projects P ON PS.ProjectID = P.ProjectID
结果:
--------------------[Project_Statuses]-----------------
Project_StatusID: 1 | 2
DateChecked: 1/9/2015 | 1/9/2015
UserChecked: User1 | User1
ProjectID: 1 | 4
Projectname: Nameless Project | Nameless Project
Projectcode: P122-323 | P122-323
Projecttype: Type 3 | Type 3
StatusID: 5 | 4
StatusName: Quote declined | Quote confirmed
-------------------------------------------------------
这正是我要防止的组合:无法同时确认和拒绝报价。这是一个非此即彼的选择。
'Quote confirmed' and 'Quote declined' cannot be both true.
通常,维护数据库的软件会检查这种情况。
不过,您可以尝试这样的操作:
Status
------
StatusID
StatusType
ExclusiveStatus
行将如下所示:
1 Quote created 0
2 Quote accepted 0
3 Quote sent 0
4 Quote confirmed 1
5 Quote declined 1
然后您可以编写一个触发器来防止使用多个非零状态。
我有一个数据库table,例如:
----[Statuses]----
StatusID
Name
------------------
以数据为例:
----[Statuses]----
1
Quote created
2
Quote accepted
3
Quote sent
4
Quote confirmed
5
Quote declined
-------------------
现在我想在界面中将其显示为多项选择,因此所有这些记录都带有复选框-但是,某些选项不是多项选择,例如 'Quote confirmed' 和 'Quote declined' 不能同时为真。
最大的问题是这个 table 是可变的 - 用户可以添加更多状态 - 否则我可以创建触发器。
我如何在记录级别上执行这种规则?有没有办法通过向此 table 添加 1 个或多个列来使其工作?
编辑: 我将针对我的问题添加更完整的设计:
还有一个table,比如:
---[Projects]---
ProjectID
Projectname
Projectcode
Projecttype
----------------
为了记录用户选择的内容,需要一个路口table:
------------------[Projects_Statuses]---------------
ProjectID
StatusID
DateChecked (date when the user clicked the status)
UserChecked (user that clicked the status)
-----------------------------------------------------
加入 tables
可能会产生以下结果SELECT *
FROM Projects_Statuses PS
INNER JOIN Statuses S ON PS.StatusID = S.StatusID
INNER JOIN Projects P ON PS.ProjectID = P.ProjectID
结果:
--------------------[Project_Statuses]-----------------
Project_StatusID: 1 | 2
DateChecked: 1/9/2015 | 1/9/2015
UserChecked: User1 | User1
ProjectID: 1 | 4
Projectname: Nameless Project | Nameless Project
Projectcode: P122-323 | P122-323
Projecttype: Type 3 | Type 3
StatusID: 5 | 4
StatusName: Quote declined | Quote confirmed
-------------------------------------------------------
这正是我要防止的组合:无法同时确认和拒绝报价。这是一个非此即彼的选择。
'Quote confirmed' and 'Quote declined' cannot be both true.
通常,维护数据库的软件会检查这种情况。
不过,您可以尝试这样的操作:
Status
------
StatusID
StatusType
ExclusiveStatus
行将如下所示:
1 Quote created 0
2 Quote accepted 0
3 Quote sent 0
4 Quote confirmed 1
5 Quote declined 1
然后您可以编写一个触发器来防止使用多个非零状态。