SQL 服务器数据库设计用户和事件表关系

SQL Server database design users and events tables relation

我有 2 tables UsersEvents.

Users table 存储有关用户的信息:姓名、电子邮件等。Events table 有一个事件列表:注册、密码重置、等等等等

如何将这两个映射到一个新的 table 中,我可以在其中存储有关用户 activity 的历史记录。

例如用户重设密码,添加一条记录到第三个 table,例如 UserEvents

我的问题是构建第 3 个 table。因此,如果我向其中添加复合键 userid 和 eventid,那将不是唯一的。因为用户会多次重置密码,最终会得到一个具有相同用户 ID 和保存事件 ID 的复合主键。

用户 Table 有以下列:

事件 Table 有以下列:

UserEvent table 应该是这样的:

我将使用 EF7 代码优先方法。

如果你想创建一个视图,你可以使用这样的东西:

SELECT *
FROM Users (NOLOCK)
INNER JOIN Events (NOLOCK) ON Users.Name = Events.Name

如果事件 table 中的 "Name" 列不是用户 table 中 "Name" 的连接,则无法连接那些 table .

您需要 table 中的共享列才能在视图中连接它们。

示例:事件中可能有 UserID 列 table,指的是拥有该事件的用户。

是的,tables 应该有一个要连接的共享列。

示例:ID 为 14 的用户发送了登录请求。事件 table SQL 字符串应该是这样的:

INSERT INTO Events (UserID, EventID) 
VALUES(14, 1)

根据示例,您还需要一个 table,它将 EventID 与名称连接起来,如下所示:

Table 事件名称

EventID    Name
1           Login request.

@gokaysatir 具有数百万行的数据库并不是使用 NOLOCK 的好理由。百万行的数据库很正常。如果用户在不使用NOLOCK的情况下无法登录,肯定是因为其他(数据修改)会话阻塞造成的。如果您真的需要 NOLOCK 以便您的用户可以登录,那么您的设计肯定有问题,或者其他流程确实效率不高。

您有没有想过 NOLOCK 的缺点?喜欢脏读?你知道什么是脏读吗?

@gokaysatir 我觉得对于NOLOCK的使用。请不要使用 NOLOCK,因为您确实可以读取不存在的数据。仅当您确实确定这不是问题时才使用它。默认情况下不要使用它。

回答问题。我觉得这个table设计的不错