【问题标题】:Best way to model resource ownership建模资源所有权的最佳方法
【发布时间】:2016-10-13 10:33:58
【问题描述】:

假设我的数据模型中有许多(少于 50 个)实体,出于安全原因,我需要存储谁拥有该实体。如果允许对资源执行特定操作的用户(谁在哪个资源上做什么),我需要能够决定每个请求。为此,需要资源所有权。

我可以想出几种不同的方法来做到这一点。一个是在每个表中我都可以有一个指向所有者的外键。这个解决方案的一个缺点是在代码中我需要查看每个单独的表以找出所有权。每次添加新表时,我都需要更新代码以查看该新表。

另一种解决方案可能是将每个特定实体视为通用资源,即具有所有权的资源。并将所有权存储在一个表中。我什至可以在没有任何外键关系的情况下做到这一点,并在代码中处理它以保持资源表同步,例如确保任何表中的每个新条目在“资源”表中都有相应的记录。一个明显的缺点是该表中将有很多记录。这样做的好处是只有一个地方可以找到所有权。

那么首选的方法是什么?考虑到最终可能会有数十万条记录(甚至可能是数百万条),将所有权存储在一个表中是否会出现性能问题?保留大量外键约束的成本如何?有没有更好的方法来解决这个问题?

谢谢

【问题讨论】:

    标签: sql-server database entity-framework


    【解决方案1】:

    您正在使用面向对象的语言。继承可以完美解决这个问题。

    根据您使用的是 Code First 还是 DB First,您的方法会略有不同,但归结为:

    1. 创建和抽象类,您可以将其称为“OwnableEntity”。本质上,您将外键和导航属性放在那里。
    2. 从此“OwnableEntity”继承您的所有实体
    3. 确保您在 EF 中的继承映射是正确的(在这种情况下,TPC inheritance 映射是您可能想要使用的)

    从现在开始,您可以针对“OwnableEntity”编写“检查所有权”逻辑,以后实现的每个实体都可以。

    【讨论】:

    • 听起来不错。如果我正确理解 TPC,这将导致(假设所有权类是抽象的)每个具体类型表都保留在每个其他具体类中相同的两列。一个对所有者的引用和一个 OwnableEntity-key 列。因此所有权详细信息不会存储在单独的表中,而是分散在每个具体的子类型表中。是否以某种方式强制不同表中的两个具体类型记录不共享相同的 OwnableEntity-key?
    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多