SQLITE继承或如何解决多个外键



我已经看到了多种解决方案,但它们似乎并不完全适合我的情况,或者至少我仍然希望有更好的解决方案。

在我的数据库中有以下表格";地方"动物";以及";人";。目前我有桌子";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数据库不是面向对象的,多态性不是一个合适的目标。

相关内容

  • 没有找到相关文章

最新更新