2017-04-14 30 views
0

我有兩個城市和郊區的表格。 Postgresql代碼:SQL - 根據預定義值插入有效數據

CREATE TABLE city 
(
    id uuid PRIMARY KEY, 
    name character varying NOT NULL, 
    CONSTRAINT city_id_key UNIQUE (id), 
    CONSTRAINT city_name_key UNIQUE (name) 
) 

CREATE TABLE suburb 
(
    id uuid PRIMARY KEY, 
    city_id uuid NOT NULL, 
    name character varying NOT NULL, 
    CONSTRAINT fk_suburb_city FOREIGN KEY (city_id) REFERENCES city (id), 
    CONSTRAINT suburb_id_key UNIQUE (id), 
    CONSTRAINT suburb_name_key UNIQUE (name) 
) 

我想創建一個名爲地址的表來存儲城市+郊區對。下面是地址表的DDL:我要確保,只有信息的冗餘拷貝插入地址

CREATE TABLE address 
(
    id uuid NOT NULL, 
    city_name character varying NOT NULL, 
    suburb_name character varying NOT NULL 
) 

。下面是一個例子:

我想允許插入地址的所有CITY_NAME suburb_name對:

SELECT c.name AS city_name, s.name AS suburb_name 
    FROM city c, suburb s 
WHERE c.id = s.city_id 

結果:

A - B 
A - C 
X - Y 

對於上述數據我想允許所有對:

A - B 
A - C 
X - Y 

但是,如果有人想插入A - Y對地址,我想DBMS提出一個錯誤R /異常。

問題:

  1. 是否有意義檢查這樣的約束?

  2. 如果這是一個有效的想法,那麼最好的解決方案是什麼?觸發器,存儲過程,某種約束?

我更喜歡DBSM獨立解決方案。我對建議的解決方案的基本概念更感興趣,而不是使用postgresql特定的解決方案。

反映@Yuri G的答案:我不想在閱讀表格地址時進行任何連接。我想在其中存儲真正的值而不是id。慢插入地址不是問題。快速閱讀對我來說很重要。插入地址後,城市或郊區表中的更改不成問題。所以不需要在地址表中更新。我只想確保插入到地址中的數據是有效的城市 - 郊區對(根據城市和郊區表)。

我的計劃是上傳包含大量數據的城市和郊區表格,並使用它們驗證地址表中的插入。我不想讓我的用戶插入地址,例如:「紐約 - 法蒂瑪賓特穆巴拉克街」,因爲法蒂瑪賓特穆巴拉克街在阿布扎比。

謝謝你的答案。

+0

爲什麼不使用主鍵而不是唯一的?你的ID列中有NULL值嗎? – Teja

+0

Updated,thx @Teja –

+0

城市名稱和郊區名稱的獨特約束可能會導致問題,因爲兩個不同的郊區可能會共享相同的名稱 - 里士滿高地,密蘇里州(聖路易斯)和里士滿高地,俄亥俄州(克利夫蘭)。以及兩個城市 - 伊利諾伊州的斯普林菲爾德和密蘇里州的斯普林菲爾德。 可以添加一個類似的「state」表,並添加city.state_id引用state.id以幫助區分。您還可以考慮將「地址」表製作成視圖,並分別處理插入每個表中的內容。 – Dan

回答

0

讓客戶端軟件操作郊區的記錄標識符,而不是它們的值。

和服務器方太這樣做:

CREATE TABLE address 
(
    id uuid NOT NULL, 
    city_id character varying NOT NULL, 
    suburb_id character varying NOT NULL, 
    CONSTRAINT fk_city FOREIGN KEY (city_id) REFERENCES city (id), 
    CONSTRAINT fk_suburb FOREIGN KEY (suburb_id) REFERENCES suburb (id), 
) 

當然,你需要2個插入之前查找操作,基本上有兩個選擇由城市/郊區的名稱,以獲取這些ID(或拒絕操作)。

雖然這樣你會保持數據完整性最簡單&高效的方式,我相信。

+0

我明白你的觀點。請看我更新的問題。謝謝@Yuri G –

+0

剛剛讀入您的更新...對不起,首先,只是好奇,我不明白這一點:你認爲通過全文搜索從分離表中讀取會比兩個連接通過數字索引? –

+0

爲了保證郊區 - 城市對的完整性 - 你甚至不需要兩張表:郊區已經與城市相關......但無論如何。如果你以你的非規範化方法堅持下來(即使你的論點聽起來很奇怪) - 請記住,在這種情況下,無論你做什麼,觸發或客戶端驗證,都需要兩個全文查找。記住查找記錄是最重要的部分,取材會更快。 –