0

我正在構建SQLite數據庫以保留我的房地產經紀人的房源。我能夠使用外鍵來爲每個代理人確定一個列表,但我想列出每個代理人記錄中的列表;從代理和列表之間的一對一關係轉變爲一對多關係。具有外鍵列表的SQLite字段

看這裏:http://www.sqlite.org/draft/foreignkeys.html,沒有提到一個字段是'外鍵列表'。我正在嘗試做什麼?

我認爲,作爲一種解決方法,我可能會創建一個包含關係本身的表,但這似乎不是一個非常乾淨的解決方案。我看了這個主題:SQLite foreign key examples,但我不確定我的元素與他們在那裏描述的多對多關係相似。

我也樂於就如何做得更好提出建議。我是否應該在實際列表中包含列表代理的名稱,並從那裏查詢?

CREATE TABLE listings 
(
    listing_id  INTEGER PRIMARY KEY AUTOINCREMENT, 
    listing_address TEXT UNIQUE NOT NULL, 
    acq_date   DATE 
) 

CREATE TABLE agent 
(
    agent_id   INTEGER PRIMARY KEY AUTOINCREMENT, 
    agent_name  TEXT NOT NULL, 
    agent_listings INTEGER, 
    FOREIGN KEY (agent_listings) REFERENCES listings (listing_id) NOT NULL 
) 

回答

2

您需要將外部關鍵字添加到listings表中;對於一對多關係來說,它是記錄外鍵的「多」方面。

CREATE TABLE listings 
(
    listing_id  INTEGER PRIMARY KEY AUTOINCREMENT, 
    listing_address TEXT UNIQUE NOT NULL, 
    acq_date   DATE 
    agent_id   INTEGER, 
    FOREIGN KEY (agent_id) REFERENCES agent (agent_id) 
) 

CREATE TABLE agent 
(
    agent_id   INTEGER PRIMARY KEY AUTOINCREMENT, 
    agent_name  TEXT NOT NULL, 
) 

如果你想上市到通過多個代理人代爲辦理(在許多一對多的關係),你必須添加一個鏈接表:

CREATE TABLE listings 
(
    listing_id  INTEGER PRIMARY KEY AUTOINCREMENT, 
    listing_address TEXT UNIQUE NOT NULL, 
    acq_date   DATE 
) 

CREATE TABLE agent 
(
    agent_id   INTEGER PRIMARY KEY AUTOINCREMENT, 
    agent_name  TEXT NOT NULL, 
) 

CREATE TABLE agent_listings 
(
    agent_id   INTEGER NOT NULL, 
    listing_id  INTEGER NOT NULL, 
    UNIQUE (agent_id, listing_id), 
    FOREIGN KEY (agent_id) REFERENCES agent (agent_id), 
    FOREIGN KEY (listing_id) REFERENCES listings (listing_id), 
) 
+0

「鏈接表」是神奇的詞語,我現在更瞭解這些關係的實現(雖然維基百科似乎更喜歡['Junction Tables'](http://en.wikipedia.org/wiki/Junction_table))。我現在有點擔心把外鍵保留在這一邊可能會極大地使查詢/刪除同步等變得複雜。 不會試圖保留列表中的元標記直接是這種惡夢嗎? 謝謝你回到我身邊。 –

+0

這是關係數據庫*工作*的方式;使用外鍵關係,您可以要求數據庫生成兩個表的笛卡爾乘積的子集。數據庫通常已經針對這種關係處理進行了優化,您將很快得到模型的掛鉤。 –

+0

您可以查看[外鍵操作](http://sqlite.org/foreignkeys.html#fk_actions)來處理級聯(刪除一個表中的行觸發其他地方的刪除操作)。 –