【发布时间】:2015-01-18 05:30:39
【问题描述】:
用于填写表格的输入是一个大文件,其中包含唯一的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...
我是这样设计的,因为我的其他来源给了我一个唯一的键(animalId,它标识了世界各地的单一动物......就像一个 uri),我不想有一个空值的大型单一数据库(例如对于 hasCoat 和 hasDorsalFin)也不必连续在两种类型的特定数据库中搜索。 此外,我可以轻松扩展这个结构(表鸟,具有属性 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 类是 Animals,但需要为每个数据库条目有一个 UUID,因为唯一的 animalId 在 animal 表中用作 PK。
此外,Dog 和 Fish 也应该扩展 Animal,因为它们需要那些数据字段……但这在 Java 中是不可能的,因为它们已经扩展了抽象的 DatabaseObject 类。
一个解决方案可能是 Dog 和 Fish 将 Animal 字段作为类成员,但这似乎是一种不好的方法。
您将如何解决这个问题以及您的设计(数据库和程序结构)有哪些优点?
编辑: 由于我的假设(...不能将 PK 用作另一个表中的 PK)是错误的,我可以将 dogId 和 fishId 更改为 animalId。此外,这种数据库设计被称为subtyping
【问题讨论】:
标签: java design-patterns database-design derived-class