【问题标题】:2 Functional Dependencies in a single table2 单个表中的功能依赖关系
【发布时间】:2017-12-03 11:28:25
【问题描述】:

我正在尝试基于这 2 个功能依赖项创建架构。

A -> B、C、D

B -> D

我正在尝试使用以下约束创建一个包含这两个 FD 的表:

  • 一对元组 (B, D) 可以重复,但遵循 FD 的定义(只要有两个 B 值相同,则 D 值也相同)。

现在,我已经在 2 个表中实现了这一点,如下所示:

CREATE TABLE one(
    B INT PRIMARY KEY,
    D INT NOT NULL,
    UNIQUE (B, D) 
); 

CREATE TABLE two(
    A INT PRIMARY KEY, 
    B INT NOT NULL,
    C INT NOT NULL, 
    D INT NOT NULL,
    FOREIGN KEY(B, D) REFERENCES one(B, D)
);

我只是想知道是否有一种方法可以在 Postgresql 中不使用 TRIGGERS 将这 2 个表合并到一个表中?

编辑:

示例数据:

【问题讨论】:

  • combine these 2 tables in just one table 是什么意思?您能否举出您想要的示例,最好包括示例数据? (我相信我理解你描述的约束,我只是不明白最后一点......)
  • @MatBailie 我的意思是,我不想创建 2 个单独的表,而只想创建一个包含所有这些属性的表。我已经用一个例子编辑了这篇文章。
  • 好吧,我想你的意思是I just want to create one table containing all these attributes AND enforce all of these constraints without requiring the second table...
  • @MatBailie 你的“想要”也不清楚;它没有说明两个表的“组合”值是什么。 jeevaa_v 大概想要他们的联接,这是无损的并且满足两个 FD,而不是两个表,它们是它的投影。
  • @philipxy - 在我提供答案的上下文中,它被接受并评论,我相信它实际上是相对清楚的。

标签: sql database postgresql functional-dependencies


【解决方案1】:

我必须自己学习,但我认为这就是你想要的......

CREATE EXTENSION btree_gist;

CREATE TABLE fd (
  a    INT PRIMARY KEY,
  b    INT NOT NULL,
  c    INT NOT NULL,
  d    INT NOT NULL,
  EXCLUDE USING gist (b WITH =, d WITH <>)
);

排除约束会检查所有行,就像UNIQUE 约束会检查所有行。但它更笼统。

如果所有检查 (b WITH =, d WITH &lt;&gt;) 都是 TRUE,则该行被拒绝。

(相反,这意味着只有至少一个检查是 FALSE 时才能接受一行。)

因此,如果两行具有相同的b 但不同的d,则正在运行的INSERTUPDATE 将失败。

http://dbfiddle.uk/?rdbms=postgres_10&fiddle=5fc308eaaedef4d3d2232ec3d70f3de6

【讨论】:

  • 这正是我想要的。可以肯定的是,仅在 Postgresql 中使用外键/唯一约束或检查约束是不可能的?
  • @jeeva_v 如果您只想要一个表,则不会...您已经展示了如何使用外键进行操作...唯一的选择是触发器等,它们都有竞争条件问题。
  • 另外,请注意EXCLUDE 实际上是CHECK 约束的一种类型。只是一个非常灵活的。
  • 我自己才发现它(不要经常使用 PostGreSQL,去谷歌看看它是否有什么“新奇”可以帮助你)。看看这个...dbfiddle.uk/…
  • 我现在完全迷上了 EXCLUDE 约束、RANGE 类型和 RANGE 运算符。感谢您的问题,如果可以的话,我会投票两次:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-24
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多