作为我自己的个人项目,我正在尝试将我们现有的Access数据库工具之一重新设计到VB.net中。这包括从头开始重新设计数据库,因为当前的数据库是绝对混乱。
这是我目前在SQL Server中重新设计的数据库:
现在要明确关系:
在Client
表格上,Client_ID
是主键。这与Contracts.Client_ID
的外键有关系。这也与Sites.Client_ID
的外键有关。
在Sites
表格上,Site_ID
是主键。这与Contracts.Site_ID
的外键有关。
每个表中的每个主键在每次创建记录时自动递增1。
这里的想法是一个简单的客户/网站/合同结构。例如,客户:Microsoft,网站:阅读总部,合同(任何类型的合同,可以适用于整个公司或单个网站)。
您无法拥有没有客户的网站。您应该能够将合同链接到客户端或站点。目前我已经允许合同中Site_ID
和Client_ID
的Null为此提供便利,因为我找不到任何方法来确保至少填写一个。
此设计是否合理并遵循最佳做法?我已经尝试按照网络上发现的一些不同建议来遵循最佳实践,命名地将表格分成不同类型的数据。将非常感激地收到任何意见
答案 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,网站的所有列。