2015-01-09 51 views
0

我有一个数据库表,例如:如何在表中执行数据库级记录之间的依赖关系

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

与数据例如:

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

2 
Quote accepted 

3 
Quote sent 

4 
Quote confirmed 

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

现在我想显示这在界面中是一个多项选择,因此所有这些记录下都有一个复选框 - 但是,有些选项不是多项选择,如“报价已确认”和“报价已拒绝”都不能同时存在。

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

我该如何在记录级执行这种规则?有没有办法,通过在此表中添加1列或更多列来使其工作?

编辑: 我将添加关于我的问题更完整的设计:

还有一个表,如:

---[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 
------------------------------------------------------- 

而这也正是我想避免的组合:报价无法确认,并在同一时间下降。这是一个任选项。

+0

因此,“状态”表包含用户实际选择的内容,对吗?那不是参考表?否则,为什么这是一个表变量? – jazzytomato

+0

实际上挑选了什么,确实记录在参考表中。例如:Projects_Statuses或Incidents_Statuses。最后,用户想要查询项目或突发事件,例如报价已被确认。但是,如果一个报价被确认并同时被拒绝,它会提供虚假信息,所以我试图使其能够克服这种结果 –

回答

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 

然后,你可以写一个触发器,它会阻止多于一个非零被使用的状态。

+1

这是一个很好的结果。我也想出了一个列添加水平。例如,created = lvl 1。Accepted = lvl 2. Sent = lvl 3. Confirmed = lvl 4,Declined也是lvl 4,但没有比这更进一步。一个触发器确实是一个好主意,强制一个关卡的出现不能被使用一次以上。 有了这个级别列,我也试着 - 我没有提到 - 创建这个状态列表的一种按时间顺序排列的清单:必须从第1级开始,然后才能检查任何高级别的复选框 –