Mysql 如何在数据库中为面向对象的设计建模?

Mysql 如何在数据库中为面向对象的设计建模?,mysql,database,data-modeling,object-oriented-analysis,object-oriented-database,Mysql,Database,Data Modeling,Object Oriented Analysis,Object Oriented Database,假设我们有以下三个概念: 概念(属性1,属性2,…) A(A、b、c、d) B(a、B、c、d、e) C(a、b、C、d、f) 有三个选项可以在数据库中为这三个概念建模: 1)按原样建模 表{column1,column2,…} A{id,A,b,c,d} B{id,a,B,c,d,e} C{id,a,b,C,d,f} Con:存在数据冗余 2)模型多功能表 A{id,object_type,A,b,c,d,e,f} Con:对于某些概念,某些字段仍然为空 3)使用表之间的关系 A{parent

假设我们有以下三个概念:

概念(属性1,属性2,…)

A(A、b、c、d)

B(a、B、c、d、e)

C(a、b、C、d、f)

有三个选项可以在数据库中为这三个概念建模:

1)按原样建模

表{column1,column2,…}

A{id,A,b,c,d}

B{id,a,B,c,d,e}

C{id,a,b,C,d,f}

Con:存在数据冗余

2)模型多功能表

A{id,object_type,A,b,c,d,e,f}

Con:对于某些概念,某些字段仍然为空

3)使用表之间的关系

A{parent_id,A,b,c,d}

B{id,parent_id,e}

C{id,parent_id,f}

Con:增加连接表的查询复杂性


你会用哪种方法?你有其他解决办法吗?您认为第三种方法的性能较差吗?

推进开发人员说,选项2“从SQL和查询性能的角度来看是最有效的实现,但仅限于少量继承字段”

推进开发人员说,选项2“从SQL和查询性能的角度来看,是最有效的实现,但仅限于少数继承字段“

显然,您的选项1是最糟糕的选择。这里的主要问题是,您需要复制
A
B
C
的所有行,从而造成严重的维护问题

您的选项2称为单表继承模式,建议在子表没有(m)任何附加列的情况下使用该模式

您的选项3称为联接表继承模式,其中子表(表示子类)通过其主键(也是引用超表的外键)联接到其超表

因此,对于您的抽象示例,选项2似乎是推荐的方法,因为您的表
B
C
只有一个附加列

请注意,根据联接表继承方法,不需要添加主键属性(就像您在
B
C
中使用
id
)。您只需使用与超级表相同的primnary键,并使其同时成为引用超级表的外键。因此,在这种方法中,模式是

A { id PK, 
    a, b, c, d 
}
B { id PK REFERENCES A, 
    e 
}
C { id PK REFERENCES A, 
    f 
}

您可以在我的教程中关于开发具有类层次结构的前端web应用程序的部分中了解更多信息。

显然,您的选项1是最糟糕的选择。这里的主要问题是,您需要复制
A
B
C
的所有行,从而造成严重的维护问题

您的选项2称为单表继承模式,建议在子表没有(m)任何附加列的情况下使用该模式

您的选项3称为联接表继承模式,其中子表(表示子类)通过其主键(也是引用超表的外键)联接到其超表

因此,对于您的抽象示例,选项2似乎是推荐的方法,因为您的表
B
C
只有一个附加列

请注意,根据联接表继承方法,不需要添加主键属性(就像您在
B
C
中使用
id
)。您只需使用与超级表相同的primnary键,并使其同时成为引用超级表的外键。因此,在这种方法中,模式是

A { id PK, 
    a, b, c, d 
}
B { id PK REFERENCES A, 
    e 
}
C { id PK REFERENCES A, 
    f 
}

您可以在我的教程中关于开发具有类层次结构的前端web应用程序的部分中了解更多信息。

感谢您的帮助。如果A{id,A,b,c,d,e,f,g}b{id,A,b,c,d,h,i,j,k}c{id,A,b,c,d,l,m,n,o}你仍然认为第一个选项是最差的吗?在这个新的例子中,你实际上没有A作为b和c的超表,因为A的属性e,f,g没有与b和c共享。这是真的。但是您可以创建一个名为Object{id,a,b,c,d}的表,并对a,b和c使用联接表继承。我想知道联接表继承的更好效率和第一个选项(我实现的称为具体表继承)的更好性能之间的权衡我认为“具体表继承”模式(名称由Martin Fowler命名)只有在类层次结构中(或多或少)只有叶类是具体类,其他所有类都是抽象类时才有意义。否则会有很多重复。谢谢你的回复。如果A{id,A,b,c,d,e,f,g}b{id,A,b,c,d,h,i,j,k}c{id,A,b,c,d,l,m,n,o}你仍然认为第一个选项是最差的吗?在这个新的例子中,你实际上没有A作为b和c的超表,因为A的属性e,f,g没有与b和c共享。这是真的。但是您可以创建一个名为Object{id,a,b,c,d}的表,并对a,b和c使用联接表继承。我想知道联接表继承的更好效率和第一个选项(我实现的称为具体表继承)的更好性能之间的权衡我认为“具体表继承”模式(名称由Martin Fowler命名)只有在类层次结构中(或多或少)只有叶类是具体类,其他所有类都是抽象类时才有意义。否则会有很多重复。