Oracle 代理输入';用户';/';角色';桌面应用程序的表格?目的是什么?

Oracle 代理输入';用户';/';角色';桌面应用程序的表格?目的是什么?,oracle,authentication,authorization,surrogate-key,Oracle,Authentication,Authorization,Surrogate Key,我必须为C#/.NET WinForms/桌面应用程序添加一些安全性。我正在使用Oracle DB后端 这些表很简单:User(ID,Name)、Role(ID,Role)、UserRole(UserID,RoleID) 我正在使用windows帐户名填充用户表。角色表现在只是简单的“管理员”、“超级用户”、“基本用户” 因为没有两个人可能拥有相同的windows帐户名。。。即使我不控制这些名称管理(netops控制,因此我想使用windows帐户,这样我就不必管理它;))。对于角色表,我再也不

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

这些表很简单:User(ID,Name)、Role(ID,Role)、UserRole(UserID,RoleID)

我正在使用windows帐户名填充用户表。角色表现在只是简单的“管理员”、“超级用户”、“基本用户”

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


一个简单的问题-为什么要麻烦用户和角色表中的“ID”(int)?有什么好处吗?这是那种“我总是这样做”的事情吗?或者我只是在一段时间内没有这样做而忘记了原因吗?

上不需要代理密钥,但下面是一些这样做的原因:

  • 一致性:如果每个表都有一个人工键,那么当您知道表名时,您总是知道键名
  • 易用性:键入更少-一键表示和上的,其中子句较短,因此不易出错
  • 互操作性:有些只适用于具有单个主键列的表

名称更改-主键值不得更改。阿比盖尔·史密斯变成了阿比盖尔·琼斯,用户名也发生了变化,但代理密钥可以防止在任何地方级联这些变化


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

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


您可能最终会得到一个表,其中唯一ID通过唯一索引强制执行,并被ORM视为PK,并用作外键关系的父级,但主键(如DB中定义的)是rolename/username/无论什么,因为您希望它作为索引表的驱动程序

“如果您有一个代理键,但没有唯一标识行的其他列组合,那么请重新考虑您的实体定义是否正确。“-哈哈。除了显而易见的更新值之外,如果你不得不更新的话,更新值要容易1000倍——这就是我要找的句子。Geeze,我想知道随着年龄的增长,我会忘记多少基本的东西,我要学的新东西的比例是多少(Kelly Bundy principal)