SQL 服务器数据库设计用户和事件表关系
SQL Server database design users and events tables relation
我有 2 tables Users
和 Events
.
Users
table 存储有关用户的信息:姓名、电子邮件等。Events
table 有一个事件列表:注册、密码重置、等等等等
如何将这两个映射到一个新的 table 中,我可以在其中存储有关用户 activity 的历史记录。
例如用户重设密码,添加一条记录到第三个 table,例如 UserEvents
。
我的问题是构建第 3 个 table。因此,如果我向其中添加复合键 userid 和 eventid,那将不是唯一的。因为用户会多次重置密码,最终会得到一个具有相同用户 ID 和保存事件 ID 的复合主键。
用户 Table 有以下列:
- 用户 ID (PK)
- 姓名
- 电子邮件
事件 Table 有以下列:
- EventId (PK)
- 姓名
- 描述
UserEvent table 应该是这样的:
- Id (PK) - 生成或标识类型
- UserId(FK 到用户 table - UserId)
- EventId(FK 到事件 table - EventId)
我将使用 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设计的不错
我有 2 tables Users
和 Events
.
Users
table 存储有关用户的信息:姓名、电子邮件等。Events
table 有一个事件列表:注册、密码重置、等等等等
如何将这两个映射到一个新的 table 中,我可以在其中存储有关用户 activity 的历史记录。
例如用户重设密码,添加一条记录到第三个 table,例如 UserEvents
。
我的问题是构建第 3 个 table。因此,如果我向其中添加复合键 userid 和 eventid,那将不是唯一的。因为用户会多次重置密码,最终会得到一个具有相同用户 ID 和保存事件 ID 的复合主键。
用户 Table 有以下列:
- 用户 ID (PK)
- 姓名
- 电子邮件
事件 Table 有以下列:
- EventId (PK)
- 姓名
- 描述
UserEvent table 应该是这样的:
- Id (PK) - 生成或标识类型
- UserId(FK 到用户 table - UserId)
- EventId(FK 到事件 table - EventId)
我将使用 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设计的不错