数据库设计 - 3个表中的外键和主键关系

时间:2014-05-20 23:21:20

标签: sql sql-server database database-design primary-key

作为我自己的个人项目,我正在尝试将我们现有的Access数据库工具之一重新设计到VB.net中。这包括从头开始重新设计数据库,因为当前的数据库是绝对混乱。

这是我目前在SQL Server中重新设计的数据库:

enter image description here

现在要明确关系:

Client表格上,Client_ID是主键。这与Contracts.Client_ID的外键有关系。这也与Sites.Client_ID的外键有关。

Sites表格上,Site_ID是主键。这与Contracts.Site_ID的外键有关。

每个表中的每个主键在每次创建记录时自动递增1。

这里的想法是一个简单的客户/网站/合同结构。例如,客户:Microsoft,网站:阅读总部,合同(任何类型的合同,可以适用于整个公司或单个网站)。

您无法拥有没有客户的网站。您应该能够将合同链接到客户端或站点。目前我已经允许合同中Site_IDClient_ID的Null为此提供便利,因为我找不到任何方法来确保至少填写一个。

此设计是否合理并遵循最佳做法?我已经尝试按照网络上发现的一些不同建议来遵循最佳实践,命名地将表格分成不同类型的数据。将非常感激地收到任何意见

2 个答案:

答案 0 :(得分:1)

我建议您查看creating and altering CHECK constraints。一个简单的条件(Client_ID IS NOT NULL或Site_ID IS NOT NULL)

作为旁注,该结构应该适用于业务规则。客户是否可以在没有网站的情况下签订合同?这有意义吗?如果是这样,那么请使用您拥有的内容,如果没有,我建议您要求合同的网站信息(您将在哪里发送发票?),因此您可以从合同中删除client_id。

鉴于这种情况很简单,我不会考虑其他因素,例如电话号码是附加到网站还是联系人?我会说联系人,因为续约人的号码可能与签订合同的号码非常不同。

答案 1 :(得分:0)

我会做像

这样的事情

<强>客户

ClientID PK,名称

仅限特定于客户的属性

<强> Client_Contracts

ClientID FK [客户(ClientID)],ContractID FK(Contrats [ContractID])

<强> Contratcs

ContractID(PK),StartDate,EndDate,SiteID FK(Sites [SiteID])

只有合同必须具有的属性。

站点

SiteID PK,网站的所有列。