mysql查找表加入3个其他表,有没有更好的方法?

时间:2012-12-14 20:24:07

标签: mysql sql

我有三张桌子

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}

有没有更好的方法来构建这种类型的数据?感觉可能会出现并发问题。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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表上面临巨大的增长。

我的方法更好地用于操作目的,而不是“数据探索”。如果你需要在这些表上执行一些主要的聚合,那么最好像你一样对数据进行非规范化,并寻找一些优化。

答案 2 :(得分:0)

只需像您描述的那样对数据进行建模。

  

此外,每个ASSET由多个页面组成

因此,向表ASSET_ID添加PAGE列。我假设几个ASSET之间不共享PAGE。

  

每个PAGE都可以有多个注释,仅供该用户使用   见。

所以使用NOTENOTE_IDPAGE_IDUSER_ID创建一个新表NOTE