3

我必须为 C#/.NET WinForms/Desktop 应用程序添加一些安全性。我正在使用 Oracle DB 后端。

这些表很简单:用户(ID,名称),角色(ID,角色),用户角色(用户ID,角色ID)。

我正在使用 Windows 帐户名称来填充用户表。角色表现在只是'Admin','SuperUser','BasicUser'......

因为不可能有两个人拥有相同的 Windows 帐户名......即使我不控制这些名称管理(netops 可以,因此我想使用 Windows 帐户所以我不必管理它;))。对于角色表,我不应该再有欺骗值 - 我控制输入,只有 3 个(战术应用程序在一年内消失)。UserRole 是一个连接表,表示用户和角色的多对多关系,因此没有代理键是合理的。

简单的问题 - 为什么要在用户和角色表中使用“ID”(int)?这里有什么要点或优势吗?这是那些“我一直都是这样做的”类型的事情之一吗?还是我只是有一段时间没有这样做而忘记了原因?

4

2 回答 2

2

名称更改 - 主键值不得更改。Abigail Smith 变成了 Abigail Jones 并且用户名发生了变化,但是代理键可以防止必须在任何地方级联这些更改。

如果您正在使用代理键,但有一列或列组合应该是唯一的,则使用唯一索引强制执行该操作。无论如何,您很有可能希望在您的 user.name 和 role.role 列上使用索引,并且唯一索引更节省空间并为优化器提供有用的元数据。如果您有一个代理键,但没有另一个唯一标识行的列组合,那么请再次考虑您的实体定义是否正确。

一个警告。特别是对于访问路径很少的非常窄的表,您可以使用索引组织的表。Oracle 将只允许在主键上使用索引组织表,但确实允许针对一组唯一列的外键(如果它由唯一约束强制执行,而不仅仅是唯一索引)。

您最终可能会得到一个表,其中唯一 ID 通过唯一索引强制执行,并被 ORM 视为 PK 并用作外键关系的父级,但主键(如数据库中定义)是角色名/用户名/任何内容,因为您希望将其作为索引组织表的驱动程序。

于 2010-12-15T23:51:59.250 回答
1

交集表不需要代理键,但这里有一些这样做的原因:

  • 一致性:如果每个表都有一个人工键,当你知道表名时,你总是知道键名。
  • 易用性:更少的打字——一键意味着ONWHERE子句更短,因此更不容易出错。
  • 互操作性:一些ORM仅适用于具有单个主键列的表。
于 2010-12-15T20:13:52.790 回答