我有三张桌子
USER
USER_ID
USERNAME
[additional fields]
ASSET
ASSET_ID
DISPLAY_NAME
[additional fields]
PAGE
PAGE_ID
[additional fields]
USER
表是您期望的表和标准USER
表。每个用户都可以向其库中添加资源,因此USER
和ASSET
之间存在一对多关系。此外,每个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}
有没有更好的方法来构建这种类型的数据?感觉可能会出现并发问题。
答案 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都可以有多个注释,仅供该用户使用 见。
所以使用NOTE
,NOTE_ID
,PAGE_ID
和USER_ID
创建一个新表NOTE
。