如何在数据库级别的表中强制执行记录之间的依赖关系

时间:2015-01-09 10:54:14

标签: sql-server database-design dependencies

我有一个数据库表,例如:

----[Statuses]----
StatusID
Name
------------------

使用数据示例:

----[Statuses]----
1
Quote created

2
Quote accepted

3
Quote sent

4
Quote confirmed

5
Quote declined
-------------------

现在我想在界面中将其显示为多项选择,因此将所有这些记录置于彼此之下并带有一个复选框 - 但是,某些选项不是多项选择,例如'引用已确认&# 39;并且'报价下降'不可能都是真的。

最大的问题是这个表是可变的 - 用户可以添加更多状态 - 否则我就能创建触发器。

我如何在记录级别强制执行此类规则?有没有办法,通过在此表中添加一个或多个列,使其工作?

修改 我将就我的问题添加更完整的设计:

还有另一张表,例如:

---[Projects]---
ProjectID
Projectname
Projectcode
Projecttype
----------------

为了记录用户选择的内容,需要联结表:

------------------[Projects_Statuses]---------------
ProjectID
StatusID
DateChecked (date when the user clicked the status)
UserChecked (user that clicked the status)
-----------------------------------------------------

通过加入表

可以得到以下结果
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
-------------------------------------------------------

这正是我想要阻止的组合:报价无法同时确认和拒绝。它是一个或两个选项。

1 个答案:

答案 0 :(得分:1)

  

'报价确认'和'报价下降'不可能都是真的。

通常,这是由维护数据库的软件检查的那种条件。

但是,您可以尝试这样的事情:

Status
------
StatusID
StatusType
ExclusiveStatus

这些行看起来像这样:

1   Quote created     0
2   Quote accepted    0
3   Quote sent        0
4   Quote confirmed   1
5   Quote declined    1

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