我有一个带有联系人的数据库。有两种不同类型的联系人,供应商和客户。
供应商表具有通过外键值附加的vendor_contacts表,以允许一对一关系。客户有一个类似的表。
这些联系人可以与电话号码表有一个或多个关系。我是否应该为每个或一个共享电话号码表有一个单独的电话号码表,其中有两个外国钥匙允许一个钥匙?
选项1
在这里,我必须强制执行vendor_id或client_id之一,而另一个则在共享电话表中没有null。
选项2
这里每个表都有自己的电话号码表。
看答案
在现代数据库系统中,“浪费空间”并不是一个有意义的问题,而“ null”值通常通过存储引擎优化,以免占用空间。
取而代之的是,我认为您需要查看可能的查询方案,可维护性以及图架的清晰度。
因此,通常,一个重复自身的模式 - 许多具有相似列的表格 - 表明可维护性差,并且通常会导致复杂的查询。
在您的示例中,想象一下一个查询,以找出谁从给定的号码打电话,以及他们可能一直在试图接触的人。
在选项1中,您查询电话号码,然后将其外部连接到两个联系表 - 相对容易。在选项2中,您有两个类似查询(只有表名的名称会更改)的联合 - 重复和很大的错误机会。
想象一下,您想将电话号码分解为国家 /地区,区域和电话号码 - 在选项2中,您必须进行两次(并将所有查询修改两次);在选项1中,您只需执行一次。
总体而言,重复是不良软件设计的标志。这也计算数据库模式。
这也是一个原因(正如@siggisv和@nigelren所建议的那样)将vendor_contact和client_contact表弄平到带有“ contact_type”列的单个表。
未经允许不得转载:迪欧吧_技术交流_资源分享_热点资讯_免费VPS空间 » mysql:最好有两张表或两列