【问题标题】:Database Mapping - Multiple Foreign Keys数据库映射 - 多个外键
【发布时间】:2012-11-30 06:56:38
【问题描述】:

我想确保这是处理特定场景的最佳方式。

假设我有三个主要表格,我将保持它们的通用性。它们都有主键,它们都是独立的表,没有任何引用。

表 1

PK
VarChar Data

表 2

PK
VarChar Data

表 3

PK
VarChar Data

这是一个场景,我希望用户能够评论上述每个表格的特定行。但我不想创建一堆评论表。所以到目前为止我是这样处理的..

有一个注释表,其中包含三个外键列,每个列引用上面的主表。存在一个限制,即只能对这些列中的一列进行赋值。

评论表

PK 
FK to Table1
FK to Table2
FK to Table3
VarChar Comment
FK to Users

我的问题:这是处理这种情况的最佳方式吗?是否存在通用外键?或者我应该为每个主表有一个单独的 cmets 表..即使数据结构完全相同?或者每个人都有一个映射表是更好的解决方案吗?

【问题讨论】:

  • 我会采用这种方法 - 好的,您有三个 FK 列,其中只有一个会有值。但是使用这种方法,您可以通过设置适当的外键约束来强制引用完整性。如果你有一个 generic FK(例如一个 type of FK 列),那么你不能这样做 - 并且能够强制引用完整性在数据库设计的范围比“保存”一两列 ....

标签: database database-design data-modeling


【解决方案1】:

我的问题:这是处理这种情况的最佳方式吗?

多个 FK 的 CHECK 只允许其中一个为非 NULL 是一种合理的方法,尤其是对于这种情况下相对较少的表。

另一种方法是从公共“父”表“继承”Table 1, 2 and 3,然后将 cmets 连接到父表。

查看herehere 了解更多信息。

是否存在通用外键?

如果你的意思是一个 FK 可以从一个桌子“跳”到另一个桌子,那么没有。

假设所有 3 个 FK 都属于同一类型1,理论上您可以通过同时保留外键值和引用的表名2 来实现类似的东西,然后通过一个触发器,但声明性约束应该比那个更好,即使代价是稍微多一点的存储空间。

如果您的 DBMS 完全支持“虚拟”或“计算”列,那么您可以执行与上述类似的操作,但无需触发器,而是根据 FK 值和表生成 3 个计算列姓名。在任何给定时间,这些计算列中只有一个是非 NULL 的,您可以对它们使用“正常”FK,就像对物理列一样。

但是,当有许多“可连接”表并且您的 DBMS 不善于存储 NULL 时,所有这些都是有意义的。如果只有 3 个,或者甚至更多,但您的 DBMS 在每个 NULL 字段上只花费一位,则几乎没有什么好处。

或者我应该为每个主表创建一个单独的 cmets 表,即使数据结构完全相同?

“数据结构”并不是唯一重要的事情。 如果您碰巧有不同的约束(例如,适用于其中一个但不适用于另一个的 FK),即使列相同,也需要单独的表。

但是,我猜这里不是这样。

或者每个人都有一个映射表是更好的解决方案吗?

我不确定您所说的“映射表”是什么意思,但您可以这样做:

不幸的是,这将允许单个评论连接到多个表(或根本没有表),这本身就是您已有的复杂性。

总而言之,您最初的解决方案可能没问题。


1 或者您愿意将其存储为字符串并接受转换,您应该不愿意这样做。

2 在实践中,这并不是一个真正的名称(如字符串)- 它是一个整数(或枚举,如果 DBMS 支持它),其中一个是众所周知的标识表的预定义值。

【讨论】:

    【解决方案2】:

    感谢所有帮助的人,我能够在我的同事的帮助下制定解决方案。我决定只使用一个,而不是多个映射表。

    此映射表包含一组 cmets,因此它没有主键。每个组行链接回评论。因此,您可以拥有多个相同的组 ID。一对多就是这种关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2014-05-31
      • 2017-02-28
      • 1970-01-01
      • 2017-10-25
      • 2012-10-03
      相关资源
      最近更新 更多