例子
我有 Person
、 SpecialPerson
和 User
。 Person
和 SpecialPerson
只是人——他们在网站上没有用户名或密码,但他们存储在数据库中以进行记录。用户拥有与 Person
和潜在的 SpecialPerson
相同的所有数据,以及他们在网站上注册时的用户名和密码。
你会如何解决这个问题?您是否有一个 Person
表,它存储一个人的所有公共(public)数据,并使用 key 在 SpecialPerson
(如果他们是特殊的人)和 User(如果他们是用户)中查找他们的数据,反之亦然?
最佳答案
将对象继承映射到数据库表通常有三种方式。
您可以制作一个大表,其中包含所有对象的所有字段,并为该类型创建一个特殊字段。虽然现代数据库通过不存储空字段来节省空间,但速度很快但会浪费空间。而且,如果您只查找表中的所有用户,其中包含各种类型的人,事情可能会变慢。并非所有或映射器都支持这一点。
您可以使用包含基类字段的所有表为所有不同的子类创建不同的表。从性能的角度来看,这是可以的。但不是从维护的角度来看。每次您的基类更改时,所有表都会更改。
您也可以按照您的建议为每个类(class)制作一张 table 。这样你就需要连接来获取所有数据。所以它的性能较低。我认为这是最干净的解决方案。
你想使用什么当然取决于你的情况。没有一个解决方案是完美的,因此您必须权衡利弊。
关于database-design - 你如何处理数据库中的多态性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45621/