gpt4 book ai didi

oracle - 桌面应用程序 'User'/'Role' 表中的代理键?目的是什么?

转载 作者:行者123 更新时间:2023-12-02 00:36:20 24 4
gpt4 key购买 nike

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

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

我正在使用 Windows 帐户名来填充用户表。角色表现在只是简单的“Admin”、“SuperUser”、“BasicUser”...

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

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

最佳答案

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

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

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

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

关于oracle - 桌面应用程序 'User'/'Role' 表中的代理键?目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4454403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com