表无关的外键?(Table-agnostic Foreign Keys?)

2019-09-16 21:02发布

首先,我看过这个StackOverflow的问题 ,所以没必要点我朝它。

我工作的一个类似的问题现在。 具体而言,我有一个用于存储有关数据库中的其他表审核信息的审核表的数据库。 此表的基本形式是:

ID,ENTITYID,EntityTypeID,ActionTypeID,日期时间

现在,你可以猜测,ENTITYID的一般性质意味着,从该表的外键关系是棘手通过ORM系统进入混合管理,特别是和你在一起。

当然,繁重的工作方案是手工做必要的查询和使用ORM的东西在那里工作,这我很好。

然而,这个问题确实上调在我心中一个问题,是否存在在那里的任何RDBMS允许形式的外键关系:表:ID进行定义。

换句话说,在这样的RDBMS中,EntityTypeID列可能包含的值如

'表A:1' 和 '表B:somekey'

所以...

有哪些做到这一点任何RDBMS?

Answer 1:

审核表通常不能对他们参照完整性约束。 审计表中,A,记录信息有关的数据,R的一行,在某些表中,T,并包含了一系列R,在一些不同的时间各表示R的记录。 当R随后被修改,在A中的信息不改变,并且不允许以防止更改到R.当R随后删除的A中的审计记录的存在不允许停止删除。



Answer 2:

顺便说一句,很明显,你可以实现类似的功能只有一个RDBMS - 通过实施一些逻辑所有其他表的结构更新审计表的结构。 你必须:

  1. 提取你要审计的所有表的结构
  2. 找到他们之间的“层次根源”:事实上,你必须保持仅主键未标记为其它表的外键的表。
  3. 创建(或重组),对每一层根的审计表。 在这里,您需要更换一套包含源表键列的模板。

因此,在一般情况下,这不是一件容易的事。 即使你有一个像SQL DOM的工具,是能够提取的模式,建立了自己的部分。



Answer 3:

你可以看看储存在一个单独的数据库审计,也许是一个面向对象的数据库等等的选项db4o的 。 这可能让你在存储方面更大的灵活性



Answer 4:

我觉得没有RDBMS都支持类似的功能。 关系结构是必须先为他们提供什么,他们一般不会帮你建立它。

在另一方面,我可以描述DataObjects.Net的一个很好的功能那是相当的与此相关的问题: 一般情况下的自动注册

想象一下,你有3种持久性:

[HierarchyRoot]
public class A : Entity 
{
  [Field, Key]
  long Id { get; set; }

  // ...
}

[HierarchyRoot]
public class B : Entity 
{
  [Field, Key]
  int Id { get; set; }

  // ...
}

// Note: it is a descendant of B
public class C : B
{
  // ...
}

并增加一个持久化类:

[HierarchyRoot]
public class AuditData<T> : Entity
  where T: Entity
{
  [Field]
  [Association(OnTargetRemove = OnRemoveAction.None)] // This ensures 
  // FK won't be created
  T Source { get; set; }

  // ...
}

DataObjects.Net会自动为这种类型的两个实例提供持久性:

  • AuditData(a)的
  • AuditData(B)的

但它不会让你创建AuditData(c)项,因为有AuditData(b)将。 因此,它使基于泛型类型约束什么登记的决定。 它也显示它很容易避免外键的创建。



文章来源: Table-agnostic Foreign Keys?