如何在数据库级别的 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

然后您可以编写一个触发器来防止使用多个非零状态。