【问题标题】:SQLITE inheritance or how to solve multiple foreign keysSQLITE 继承或如何解决多个外键
【发布时间】:2022-01-18 23:17:08
【问题描述】:

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

在我的数据库中有以下表格“地点”、“动物”和“人”。目前我有表“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")
)

woulbe-table(Being 是动物和人的父母)

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”更好? 因此,我不是用两张表来描述一个人在一个地方,而是可以用一张来代替。为了让所有众生都在一个地方,我不再需要跑过 2 张桌子。如果“将属于的东西放在一起并合并相似的关系是好的”假设是错误的,我将接受解释作为答案并重新提出问题。

【问题讨论】:

  • 嗨 - 你是基于什么断言“多态方法“hasBeing”会更合理”?
  • 我在问题中添加了解释,因为我确实错过了。

标签: sql sqlite foreign-keys


【解决方案1】:

您的 has* 表称为链接表,因为它们将数据库中的两个实体链接在一起。如果一个实体与其他两个实体相关联,则其他每个实体都需要一个 FKey,就像您在原始实体中一样。

现在你正在引入一个新实体:一个存在,但只是作为一个链接,并没有真正的存在实体。这不是一个好的设计。您最好使用原版或:

  • hasBeing 有一个人名和动物名作为单独的可空值 列,它们的表带有 FK,并且两个名称之一将 始终为空。

  • 将人和动物合并到一个表中,并带有一个标志来指示什么 每行代表的实体类型。 (不是一个好主意,因为没有 两者之间的数据有很多共同点,但它可能是有用的 技术。)

原来的方式可能是最好的,而且绝非罕见。请记住,关系型数据库不是面向对象的,多态性也不是合适的目标。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-06-09
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多