mysql:最好有两张表或两列

我有一个带有联系人的数据库。有两种不同类型的联系人,供应商和客户。

供应商表具有通过外键值附加的vendor_contacts表,以允许一对一关系。客户有一个类似的表。

这些联系人可以与电话号码表有一个或多个关系。我是否应该为每个或一个共享电话号码表有一个单独的电话号码表,其中有两个外国钥匙允许一个钥匙?

选项1

enter image description here

在这里,我必须强制执行vendor_id或client_id之一,而另一个则在共享电话表中没有null。

选项2

enter image description here

这里每个表都有自己的电话号码表。

看答案

在现代数据库系统中,“浪费空间”并不是一个有意义的问题,而“ null”值通常通过存储引擎优化,以免占用空间。

取而代之的是,我认为您需要查看可能的查询方案,可维护性以及图架的清晰度。

因此,通常,一个重复自身的模式 - 许多具有相似列的表格 - 表明可维护性差,并且通常会导致复杂的查询。

在您的示例中,想象一下一个查询,以找出谁从给定的号码打电话,以及他们可能一直在试图接触的人。

在选项1中,您查询电话号码,然后将其外部连接到两个联系表 - 相对容易。在选项2中,您有两个类似查询(只有表名的名称会更改)的联合 - 重复和很大的错误机会。

想象一下,您想将电话号码分解为国家 /地区,区域和电话号码 - 在选项2中,您必须进行两次(并将所有查询修改两次);在选项1中,您只需执行一次。

总体而言,重复是不良软件设计的标志。这也计算数据库模式。

这也是一个原因(正如@siggisv和@nigelren所建议的那样)将vendor_contact和client_contact表弄平到带有“ contact_type”列的单个表。

未经允许不得转载:迪欧吧_技术交流_资源分享_热点资讯_免费VPS空间 » mysql:最好有两张表或两列