0

在我的网站上,用户可以制作一些物品,这些物品放在Items桌子上。
用户也可以互相关注,以及我存储在Followings表中的那些数据。
现在我需要一张跟踪用户活动的表,所以我创建了:

Users{UserId, Username, FirstName, LastName}
Items{ItemId, Title, CreatedByUserId}
Activity{ActivityId, ActivityTypeId, UserId, ItemId}

这里ItemId可以是或ItemId来自Items表或UserId来自Users表。

这个设计好还是有更好的方法来做到这一点?

编辑:我添加了表结构。关键是每次用户创建项目或开始关注某个用户时,我都不会向该 Activity 表添加记录。所以我总是可以跟踪用户在网站上做了什么。

4

2 回答 2

1

这里的 ItemId 可以是 Items 表中的 ItemId 或 Users 表中的 UserId。

这将阻止 DBMS 强制执行外键。如果您沿着这条路线走,最好将这些字段分开(这样您就可以将外键指向它们各自的表)并使用 CHECK 来确保其中一个是非 NULL 的:

在此处输入图像描述

CHECK (
    (ITEM_ID IS NOT NULL AND FOLLOWED_USER_ID IS NULL)
    OR (ITEM_ID IS NULL AND FOLLOWED_USER_ID IS NOT NULL)
)

PK经过ACTIVITY精心设计,可以轻松查询特定用户的“时间线”,并且对集群友好。

(您可能需要也可能不需要ACTIVITY.TYPE,具体取决于您要跟踪的具体内容。)


另一种方法是为每种活动设置一个单独的表:

在此处输入图像描述

(您可以添加一个TYPE字段FOLLOW_ACTIVITY来区分“关注”和“取消关注”。)


另一种选择是从一个共同的父“类”继承用户和项目,然后链接到该类:

在此处输入图像描述

在这种情况下,这种设计可能有点矫枉过正,但如果您稍后添加许多其他类型的可以跟踪的对象,它可能会很有用。

于 2013-01-05T11:20:51.180 回答
0
Items{ItemID,descr,UserIDCreator,date-time}
User{UserID,descr}
Followings{UserIDFollowed,UserIDFollower,date-time}

现在,如果您不希望所有由 eser 创建的项目在以下项目上使用相同的用户代码,我会为 chrono select 添加日期时间

您可以创建触发表或视图,这取决于数据的基数

如果同一对象可以在用户之间共享

Items{ItemID,descr,}
UserItems{UserID,descr,ItemId,date-time}
User{UserID,descr}
Followings{UserIDFollowed,UserIDFollower,date-time}

我希望有用

于 2013-01-04T21:07:11.637 回答