0

我有三张桌子

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}

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

4

3 回答 3

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 
于 2012-12-14T20:39:30.557 回答
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表格可能会面临巨大的增长。

My approach would serve better an operational purpose, rather than a "data exploration" one. Later on if you would need to perform some major aggregation on these tables it would be a good idea to denormalize data like you did and look for some optimization as well.

于 2012-12-14T21:06:32.523 回答
0

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

此外,每个资产由多个页面组成

所以ASSET_ID在 table 中添加一列PAGE。我假设一个 PAGE 不在几个资产之间共享。

并且每个页面可以有多个仅供该用户查看的注释。

因此,NOTE使用NOTE_ID、和来创建一个新表。PAGE_IDUSER_IDNOTE

于 2012-12-14T20:32:59.303 回答