用于填充表格的输入是一个大文件,其中具有唯一的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/