2017-04-10 52 views
0

SQLite數據庫我想有一個數據庫,兩個表,就像這樣:在兩個表中,將相互替代

Parent 
------- 
Pk 
UgliestChildPk 
StrongestChildPk 


Child 
------ 
Pk 
ParentPk 

我使用SQLite的工作,儘管這可能不會涉及太多。 在我的模型中,Parent總是至少有一個Child,在這種情況下,最醜的和最強的將是Parent的唯一Child。 我需要能夠檢索所有父母的孩子(通過Child.ParentPk外鍵)。我還需要能夠有效地找回家長最醜陋和最強壯的孩子。 我需要能夠添加和刪除孩子,以及更改哪些是最醜的和最強的。

我收集它會拋出一個標誌,即父表和父表互相引用。有沒有更好的方式來完成這種類型的關係?

我可以添加一個IsUgliest和IsStrongest列到Child表中,但我想要有效地確保每個Parent有一個且只有一個最醜陋和最強的子(儘管它們可能是相同的)。 我也不想將索引添加到IsUgliest和IsStrongest列以便快速檢索它們。我描述的模式可以防止這種情況,因爲無論如何Pk列都是隱式索引的。

有沒有更好的方法? 有什麼建議嗎?

+0

。我的意思是:我想替換父母X中最強壯的孩子。對其他人來說,「老」孩子是最強/最醜的孩子嗎?如果不是,您可以將其刪除並插入新的孩子。如果舊的孩子「仍然有用」(它是同一個或另一個父母最強/最醜的孩子),則只需更新父母,但不要刪除孩子。或者使用另一種方法,你可以做一個父母的更新,然後刪除所有「無用」的孩子。 –

+0

你提出的模式很好。爲什麼你說「我收集它會拋出一個標誌,表示父母和孩子的表格都是相互引用的」? –

+0

人們似乎對這樣的結構不滿,部分原因是因爲它試圖使用外鍵約束時會創建一個不可能的雞/蛋情況。 – hyperspasm

回答

0

我更喜歡下面的選項2,因爲它最容易維護和製作邏輯。

選項1

一個做到這一點的方法是在表中指定創建[strongest] not null unique。然後,您將決定如何列出最強大的1是最強的。

雖然這可以讓你做你正在問的問題,但你需要一些邏輯重新排列表中的值,以便你可以添加或刪除其他孩子。這將允許您輕鬆地重新分配基於上升的最醜的孩子/降序你對你的醜/強度設定得分

選項2

這樣做將是仍然使用IsStrongest的第二種方式和IsUgliest列,但將其類型設置爲布爾值,然後執行檢查以確保只有一個人在嘗試添加新的最醜或最強的子時設置爲true

選項3 使用您提供的表結構來快速跟蹤父表中最強和最醜陋的子權利。你可能會需要跟蹤孩子的力量和美感的一種替代方法,使您可以輕鬆地確定誰是父母最醜/最強孩子

此外 如果有一個以上的父的可能性,你應該使用一個鏈接表如果你想確保不會有任何的「平均」的孩子(不是最強的,而不是最醜陋的),你將不得不做的時候要更換他們的支票,看起來像這樣

Parent_Child 
------------ 
PCPK 
Parent_FK 
Child_FK