分配网站的数据库架构 - 这是多对多关系吗?

时间:2013-08-14 18:12:26

标签: asp.net sql-server-2008 visual-studio-2008 junction-table expression-web

我正在创建一个asp.net网站(通过Expression Web 4和Visual Web Developer 2010 Express),使用通过Sql Server 2008创建的数据库。然而,我对数据库模式的问题感到困惑,该数据库模式将提供给网站。

正在创建的网站允许创建法律案件,并记录案件类型,然后将律师和/或辩护人和/或支持人员记录为处理案件。

因此,一个名为'Kramer v Kramer'的案件将是一起离婚案件,其中包括2名律师,1名律师和4名支持人员。然而,另一起案件“The People v Larry Flynt”可能是一个起诉案件,有4名律师,没有辩护律师和10名支持人员。

到目前为止我所做的是我有一个名为'案例表'的表,其中包含以下列:

Case_ID(这是表的主键); Case_Type_ID; Lawyer_ID; Advocate_ID和Support_Staff_ID。案例表中的最后4列是外键。

Case_Type表只有两列:'Case_Type_ID'(PK)和'Area_of_law'。 Case_Type_ID只是数字(001,002 ...),'Area_of_law'是char(30)(例如诉讼,离婚,财产,犯罪)。到目前为止,非常好。

问题是(这适用于倡导者和支持人员),如果我创建律师表只有三列:

Columns = Lawyer_ID(作为主键)|名字|姓氏

记录1 = 001 |汤姆|汉克斯

记录2 = 002 |汤姆|巡航

记录3 = 003 |丹尼尔|克雷格

记录4 = 004 |妮可|基德曼

如何指派多名律师参与此案?

案例表中,为了符合规范化规则,我可能需要将列添加到案例表,如上所述,以便记录Lawyer_ID_1( FK)| Lawyer_ID_2(FK)| Lawyer_ID_3(FK)| Lawyer_ID_4(FK)。

所以它可能是004 | 002 |空| Null表示妮可基德曼和汤姆克鲁斯正在研究这个案子。如果我只有一个Lawyer_ID专栏,为了向妮可基德曼和汤姆克鲁斯展示这个案子,那就必须是'004,002',这是我在这个网站上看到的一个大禁忌。

通过将所有律师记录在一个单独的表中,我能够在可视化Web开发人员2010快递中创建数据绑定列表(绑定到律师表),因为它使用名称填充列表律师。所以我很满意这种方法。

但如果在 Lawyer Table 中有50名律师,我需要在案例表中分配50个专栏,只分配给律师(如果案件结束时) 50名律师正在研究它。这种方法存在问题,因为如果律师被删除或添加律师,案例表可能会出现偏差,因为律师栏的数量会受到影响。显然这是一个糟糕的方法,任何人都可以提供帮助吗?

是否有一个数据库架构允许一个'Case'记录与多个'Lawyer'记录相关,而没有多列? (希望模式也可以应用于支持人员表倡导者表)。

非常感谢您的帮助。我是网络开发和SQL数据库工作的新手,我试图查找解决方案,但我可能不知道我的问题的关键字。

1 个答案:

答案 0 :(得分:0)

这可能是多对多的关系。请允许我在您的案例中解释一下这三种关系:

如果每个案件只有一名律师,而且每个律师只能处理一个案件,那么你就有一对一的关系。

如果每个案件只有一名律师,但每个律师可以处理多个案件,那么你就有一对多的关系。同样,如果每个案件可以有多名律师,但每个律师只能处理一个案件,那么你仍然有一对多的关系。

如果每个案件都有多名律师,而且每个律师都可以处理多个案件,那么你就有多对多的关系。

多对多关系的典型解决方案是使用第三个表来描述关系:

create table casesALawyerWorksOn (case_id, lawyer_id)

如果@albert,@ brad和@christine处理案例@peopleVflynt,那么:

insert into casesALawyerWorksOn (case_id, lawyer_id) values
    (@albert, @peopleVflynt)
    (@brad, @peopleVflynt)
    (@christine, @peopleVflynt)

因此,律师@fred所处理的所有案件都是:

select case_id from casesALawyerWorksOn where lawyer_id = @fred

所有处理案件@kramerVkramer的律师都是:

select lawyer_id from casesALawyerWorksOn where case_id = @kramerVkramer