2012-12-14 49 views
0

我有三個表mysql查詢表加入3個其他表,有沒有更好的方法?

USER 
USER_ID 
USERNAME 
[additional fields] 

ASSET 
ASSET_ID 
DISPLAY_NAME 
[additional fields] 

PAGE 
PAGE_ID 
[additional fields] 

USER表是你所期望和標準USER表。每個用戶都可以將資產添加到其庫中,因此在USERASSET之間存在一對多的關係。此外,每個ASSET由多個頁面組成,並且每個PAGE可以具有僅供該用戶看到的多個筆記。我最初的想法是讓所有三個表之間的查找表:

USER_ASSET_PAGE 
UAP_ID 
USER_ID 
ASSET_ID 
PAGE_ID 
NOTE 

所以現在我有查詢USER_ASSET_PAGE表來獲取對應於特定文檔的特定頁面,不同的用戶注意事項:

SELECT NOTE 
FROM USER_ASSET_PAGE 
USER_ID = {user_id} AND ASSET_ID = {asset_id} AND PAGE_ID = {page_id} 

有沒有更好的方法來構造這種類型的數據?感覺就像在路上有可能出現複雜情況。

回答

2

那麼根據您的描述,我個人會用以下情形:

USER {UserID,User_Name},...; 
ASSET {AssetID,DISPLAY_NAME,UserID (FK)}; 
PAGE {PageID,AssetID (FK)...}; 
NOTE {NoteID,Note,PageID (FK)}; 

然後,查詢來自特定用戶,資產和頁面的筆記:

Select n.NOTE 
From NOTE n 
inner join PAGE p on p.ID=n.PageID 
inner join ASSET a on a.AssetID=p.AssetID 
inner join USER u on u.UserID=a.UserID 
where u.UserId=x and p.PageID=y and a.AssetID=z 

這顯然是一個規範化的嘗試。當然,這一切都取決於你的目標是什麼以及要存儲的預期數據。數據量較低時,您的非規範化設計就足夠了。但是,如果數據量很大,數百個擁有數百頁資源的用戶可能會在您的USER_ASSET_PAGE表中面臨巨大的增長。

我的方法將更好地用於操作目的,而不是「數據探索」。稍後如果您需要在這些表上執行一些主要聚合,那麼像您一樣對數據進行非規範化並尋找一些優化是個好主意。

0

只需模擬您描述的數據。

此外,每個資產是由多頁

這麼一個ASSET_ID列添加到表PAGE。我假設一個PAGE不在幾個ASSET之間共享。

並且每個PAGE可以有多個註釋,只是針對該用戶的 請參閱。

因此,創建一個新的表NOTENOTE_IDPAGE_IDUSER_IDNOTE

3

創建4個表

**USER** 
USER_ID 
USERNAME 
[additional fields] 

**ASSET** 
ASSET_ID 
USER_CHILD_ID 
DISPLAY_NAME 
[additional fields] 

**PAGE** 
PAGE_ID 
ASSET_CHILD_ID 
[additional fields] 

**NOTE** 
NOTE_ID 
PAGE_CHILD_ID 
NOTE_TEXT 
[additional fields] 

然後獲取數據,寫SELECT語句:

select NOTE_TEXT from NOTE inner join PAGE on PAGE_CHILD_ID = PAGE_ID inner join ASSET on ASSET_CHILD_ID = ASSET_ID where USER_CHILD_ID = :USERID 
+0

我建議完全相同的設計。我沒有看到這個問題的答案更新,因爲我已經打字了。對於那個很抱歉。 – Ivo