例如,我有两张表:'customer'和'staff'。它们几乎相同,只有两个属性不同。那么我应该创建另一个名为'person'的表,包含'customer'和'staff'的所有相同属性,然后创建指向此'person'的外键?这类似于类设计中的继承。
这种方法有什么缺点吗?
这种方法有什么缺点吗?
是的,这种方法有一个缺点。连接操作会增加查询复杂度(在某些情况下非常大),如果不小心还会增加查询时间。
相反,标准做法是使用单表继承来模拟对象继承,当子类之间仅有少数属性不同时。这种方法可以避免数据库连接,但会浪费一点未使用的数据库空间。
具体实现方法如下:创建一个包含所有属性的表,包括只适用于其中一个子类的属性,以及一个type
属性来指定对象类型。例如,如果customer
有以下属性:
id
、name
、email
、password
、order_date
而staff
有以下属性:
id
、name
、email
、password
、hire_date
那么就需要创建一个包含所有属性和类型的表:
id
,type
,name
,email
,password
,order_date
,hire_date
type
列始终包含“customer”或“staff”。如果type
为“customer”,则hire_date
始终为NULL,并且没有意义。如果type
为“staff”,则order_date
始终为NULL,并且没有意义。
Pranay Rana和Ben Lee都是正确的,最终答案是:"取决于情况"。
你必须权衡子类专用列的数量与通用列的数量,以决定哪种方式适合你。单表继承不具备良好的可扩展性:如果您必须引入第三种子类(例如供应商),会发生什么情况?
同样,您将如何对待既是员工又是客户的人员?
permissions
的“administrator”类型,则您的单表将包含id、type、name、email、password、order_date、hire_date、permissions。现在type可以是“customer”、“staff”或“administrator”。不适用于特定类型的字段仅保留为空。明白吗? - Ben Lee