我已经看到了多种解决方案,但它们似乎并不完全适合我的情况,或者至少我仍然希望有更好的解决方案。
在我的数据库中有以下表格";地方"动物";以及";人";。目前我有桌子";hasAnimal";以及";hasPeople";,但是多态方法";hasBeing;会更合理。但我想把外键连接起来;但就我所见,一个人无法连接两个外键。
我应该如何解决多态性问题?
我对数据库了解不多,所以解决方案可能很明显。
我现在将添加更多信息,以防我的书面问题/解释没有包含足够的信息
CREATE TABLE "persons" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
"firstname" TEXT NOT NULL,
"surename" TEXT
)
CREATE TABLE "animals" (
"name" TEXT NOT NULL UNIQUE,
"description" TEXT NOT NULL,
"movementLocations" INTEGER NOT NULL,
"movementPlaces" INTEGER,
"groupsize" INTEGER NOT NULL,
"link" TEXT,
PRIMARY KEY("name")
)
CREATE TABLE "places" (
"name" TEXT NOT NULL UNIQUE,
"description" TEXT NOT NULL,
PRIMARY KEY("name")
)
CREATE TABLE "hasPerson" (
"id" TEXT NOT NULL,
"place" TEXT NOT NULL,
FOREIGN KEY("id") REFERENCES "persons"("id"),
FOREIGN KEY("place") REFERENCES "places"("name"),
PRIMARY KEY("id","place")
)
CREATE TABLE "hasAnimal" (
"name" TEXT NOT NULL,
"place" TEXT NOT NULL,
PRIMARY KEY("name","place"),
FOREIGN KEY("name") REFERENCES "animal"("name")
)
和将是桌子(存在将是动物和人的父母(
CREATE TABLE "hasBeing" (
"name" TEXT NOT NULL,
"place" TEXT NOT NULL,
PRIMARY KEY("name","place"),
FOREIGN KEY("name") REFERENCES "animal"("name") OR "person"("id")
)
为什么我认为使用"hasBeing我不是用两个表来描述一个人在一个地方,而是可以用一个表来代替。为了让所有的生物都在一个地方,我不再需要跑过两张桌子。如果假设";将本应在一起的东西结合在一起并融合相似的关系是好的";是错误的,我会接受这个解释作为答案,并重新表述这个问题。
您的has*表被称为链接表,因为它们将数据库中的两个实体链接在一起。如果一个实体与另外两个实体链接,那么其他实体中的每一个都需要一个FKey,就像您在原始实体中一样。
现在你引入了一个新的实体:存在,但只是作为一个链接,并没有实际的存在实体。这不是一个好的设计。你最好使用原件或:
-
hasBeing的人名和动物名都是可为null的列,在其表中添加FK,并且两个名称中的一个将始终为null。
-
将人和动物合并到一张表中,并用标志指示每行表示的实体的种类。(这不是一个好主意,因为没有两者之间的数据有很多共性,但它可能是有用的技术。(
最初的方式可能是最好的,而且并不罕见。请记住,Relational数据库不是面向对象的,多态性不是一个合适的目标。