儘管將地址建模爲用戶定義類型(UDT)是一種好方法,但您還應該考慮查詢模式的外觀。你只能通過userid
查詢用戶嗎?或者你想按名稱查詢它們?
爲了證明這一點,我將創建一個地址UDT和設計usersByLastName
查詢表:
CREATE TYPE address (
street TEXT,
city TEXT,
state TEXT,
postal TEXT,
country TEXT);
CREATE TABLE usersByLastName (
userid BIGINT,
firstName TEXT,
lastName TEXT,
addresses MAP <TEXT, FROZEN <address>>,
PRIMARY KEY (lastName,firstName,userid));
注意addresses
創建爲address
地圖,讓你有型有一定的靈活性(家,辦公室,運輸,結算等)以及您可以爲每個用戶添加的地址數量。
接下來,我將通過lastName
插入一些數據和查詢,這將產生:
[email protected]:stackoverflow> SELECT * FROM usersbylastname WHERE lastname='Doe';
lastname | firstname | userid | addresses
----------+-----------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Doe | Jane | 73184 | {'business': {street: 'A Office St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'home': {street: 'B Pretty St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'shipping': {street: '1187 Huntervasser', city: 'Los Angeles', state: 'CA', postal: '90036', country: 'US'}}
Doe | John | 73180 | {'business': {street: 'A Office St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}, 'home': {street: 'A Pretty St.', city: 'Somecity', state: 'CT', postal: '55555', country: 'US'}}
(2 rows)
這是你可以模擬這種方式之一。同樣,考慮您的查詢要求也很重要。
編輯:我現在在卡桑德拉峯會的主題演講中,喬納森·埃利斯剛剛演示了一個帶有地址圖的用戶表,幾乎完全是我做的。
如何創建兩個'Map'數據類型:'Home_Address'和'Business_Address',它與UDT相比有什麼不同? – sras
@sras我用這個解決方案看到的問題是它將您的業務邏輯與您的數據模型混合在一起。現在,未來業務案例需要的任何新地址類型都將需要架構更改。使用MAP地址可以更好地應對未來,從而不必對模型進行這些類型的更改。 – Aaron
感謝您的回覆和解釋。 – user1860447