java - 对于派生数据库结构来说,什么是好的设计?

标签 java design-patterns database-design derived-class

用于填充表格的输入是一个大文件,其中具有唯一的animalId、它们的名称、它们的动物类型和一些其他动物类型特定值。

数据库如下所示:

table animal:
- animalId(pk)
- name
- type(fk to animalType table)   

table dogs:         
- dogId(pk)         
- animalId(fk to animal)    
- hasCoat           
- etc...            

table fish:
- fishId(pk)
- animalId(fk to animal)
- animalId(fk to animal)
- dorsalFinCount
- etc...

我这样设计,因为我的另一个来源给了我一个唯一的 key (animalId,它标识世界各地的单一动物......就像 uri),并且我不想拥有一个包含空值的大型单一数据库(例如,对于 hasCoat 和 hasDorsalFin)也不必连续​​在两种类型的特定数据库中搜索。 此外,我可以轻松扩展此结构( table 鸟,具有属性 hasWing、wingColor 等...)

我的(Java)程序设计如下:

abstract class Animal
- animalId
- name
- type

class Dog extends DatabaseObject 
class Fish extends DatabaseObject 

abstract class DatabaseObject 
    private UUID id;
    public DatabaseObject(){this.uuid = UUID.randomUUID();}
    public UUID getId();

问题是,Dog 和 Fish 类都是动物,但每个数据库条目都需要有一个 UUID,因为唯一的 AnimalId 在动物表中用作 PK。 此外,Dog 和 Fish 还应该扩展 Animal,因为它们需要这些数据字段...但这在 Java 中是不可能的,因为它们都已经扩展了抽象 DatabaseObject 类。

解决方案可能是,Dog 和 Fish 将 Animal 字段作为类成员,但这似乎是一个糟糕的方法。

您将如何解决这个问题以及您的设计(数据库和程序结构)的优点是什么?

编辑: 由于我的假设(...PK不能用作另一个表中的PK)是错误的,我可以将dogId和fishId更改为animalId。此外,这样的数据库设计被称为subtyping

最佳答案

不要重新发明轮子,使用 ORM。如果你可以使用 Hibernate,已经有一个 Inheritance Mapping功能。

关于java - 对于派生数据库结构来说,什么是好的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27038163/

相关文章:

php - 如何设计用于跟踪具有设置最大项目的订单的数据库

java - 限制字符串中的字符数,并截断其余字符

java - 我处于反模式中,我想离开

java - Android 上解密数据库的临时存储

sql - 在 SQL 中管理图片标签

database-design - 星形/雪花模式的 ORM 等价物

java - 在 java 中使用 SimpleMailMessage 发送时显示发件人的地址而不是他的名字

class - 根据上下文仅返回对象中所需数据的最佳模式是什么?

wpf - WPF 的 MVVM 的漂亮而简单的定义

java - 在 setter 方法中验证模型类