我已經看到了多種解決方案,但它們似乎并不完全適合我的情況,或者至少我仍然希望有更好的解決方案。
在我的資料庫中有以下表格“地方”、“動物”和“人”。目前我有表“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”更好? 我不是用兩張表來描述一個人在一個地方,而是可以用一張表來代替。為了讓所有眾生都在一個地方,我不再需要跑過 2 張桌子。如果“將屬于的東西放在一起并合并相似的關系是好的”假設是錯誤的,我將接受該解釋作為答案并重新表述問題。
uj5u.com熱心網友回復:
您的 has* 表稱為鏈接表,因為它們將資料庫中的兩個物體鏈接在一起。如果一個物體鏈接到其他兩個物體,則其他每個物體都需要一個 FKey,就像您在原始物體中擁有的那樣。
現在你正在引入一個新的物體:一個存在,但只是作為一個鏈接,并沒有實際的存在物體。這不是一個好的設計。您最好使用原始版本或:
hasBeing 將人名和動物名作為單獨的可空列,將 FK 放在他們的表中,并且這兩個名稱之一將始終為空。
將 Persons 和 Animals 合并到一個表中,并帶有一個標志,指示每行代表的物體型別。(這不是一個好主意,因為兩者之間的資料沒有太多共同點,但它可能是一種有用的技術。)
原來的方式可能是最好的,而且遠非罕見。請記住,關系資料庫不是面向物件的,多型性不是一個合適的目標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/388123.html
