Database design 客户数据库设计

Database design 客户数据库设计,database-design,sql-server-2008-r2,Database Design,Sql Server 2008 R2,我们设计这个数据库是为了跟踪我们的客户数据库,但我觉得它有点复杂,我觉得它可以更简单一些,有人能给我们一些设计建议吗? 关于此图表的一些想法: 在多对多联接表上设置主键这两列应该是主键 我不认为表中重复的电话号码违反了规范化规则,相反,我认为这是巧合。你不可能仅仅因为两个人的名字叫乔就有一整张桌子。另外,想象一下,如果两个人共用一个电话号码,那么其中一个人会得到一个不同的号码。如果电话直接引用客户,更新一个号码是一个简单的操作,但插入一个新电话并在连接表上进行多个操作只是为了做同样的事情,这对

我们设计这个数据库是为了跟踪我们的客户数据库,但我觉得它有点复杂,我觉得它可以更简单一些,有人能给我们一些设计建议吗?


关于此图表的一些想法:

在多对多联接表上设置主键这两列应该是主键 我不认为表中重复的电话号码违反了规范化规则,相反,我认为这是巧合。你不可能仅仅因为两个人的名字叫乔就有一整张桌子。另外,想象一下,如果两个人共用一个电话号码,那么其中一个人会得到一个不同的号码。如果电话直接引用客户,更新一个号码是一个简单的操作,但插入一个新电话并在连接表上进行多个操作只是为了做同样的事情,这对我来说很奇怪。 电子邮件也是如此。 如果有多种选择,应用程序将如何选择使用哪部手机或电子邮件?是否应提供默认位或序号列? 客户是否有多个地点、多家公司,或者两者都有?
如果简单性是这里的关键,我建议您将与客户相关的地址类型信息折叠到一个表中,如下所示:

    customer_contact_details{
    customer_id MEDIUM_INT
    contact_type VARCHAR2(10)
    contact_details VARCHAR2(100)
    status BOOLEAN
    }

然后,根据您的需要,联系人类型字段可以标记为家庭电话、电子邮件、主要电子邮件、工作电话、主要联系人。然后,您可以将所有此类相关联系信息放在一个表中。简化了您的模式,您只需要一个连接即可理解信息。

另一个部分解决方案是使用联系人表:客户的联系人是一对多;每个联系人可能有几个电话号码,即使这样,您也只需要一个手机号码、一个家庭号码、一个工作号码和一个传真号码,但只需要一个电子邮件地址。

您真的需要将电子邮件拆分到这一点吗?通常一个客户提供一封电子邮件。否则,我觉得不错。我们这样做是因为我们的客户在不同的地方工作,比如accountingPhone table缺少电话类型。实际上,您不需要电话类型表。只需添加一列phone_类型,并为该类型存储H、M或O。对于电子邮件,一位客户将有多封电子邮件?如果有否决评论的选项,我会投票否决Bhrugesh的建议。是的,因为在加拿大,一些会计师正在与不同的客户合作,有时会收到许多电子邮件。我不同意一对多客户和电子邮件,因为客户提供一封电子邮件。谢谢您的电子邮件和电话。在我们的案例中,客户有时会在不同的位置工作。在数据库实体表上有一个状态字段,这样您就可以将实体标记为已启用、已禁用或活动等。这有助于避免从数据库中删除行或记录,从而破坏您的关系。您可以将实体标记为非活动,并在数据库中保留fk关系。在您的特定情况下,具有多种地址类型的客户可能会选择停用其当前家庭地址,可能是因为他搬家了或其他原因。在这种情况下,您肯定不想为了一个新地址而丢失旧地址,因为已经有对旧地址的引用。如果我有两个客户的电话号码相同,这会造成数据冗余,我可以添加电话分机或其他使其独特的功能?@aelnajjar显然您将根据需要对表进行索引。我在这里展示的只是数据模型。为了防止冗余,只需根据您的需要在客户id、联系人类型和联系人详细信息的任意组合上添加一个复合唯一索引。2拥有相同电话号码的客户不应该是问题,他们可能是同一个家庭的成员。为什么他们不能共享同一个家庭电话号码?他们可以共享电话号码。设计它的原因之一是多对多客户和电话用户可以更新一次,但我无法提供良好的UI模型,直到我看到您的建议并创建通用表来容纳所有类型的联系电话、传真、电子邮件或网站。我添加了数据库图的新照片,你能告诉我你怎么看吗?看起来不错,但我会将所有字段设置为不允许空值。在这个设置中真的不需要允许空值,是吗?