【问题标题】:How to manage postgresql foreign keys?如何管理 postgresql 外键?
【发布时间】:2020-06-21 18:39:09
【问题描述】:

我需要一些关于 Postgresql 上的 SQL 结构的建议。

我有这两张桌子:

DROP TABLE IF EXISTS "public"."attribute_value";

CREATE TABLE "public"."attribute_value"
(
"id"                        INTEGER NOT NULL,
"attribute_id"              INTEGER NOT NULL,
"value"                     CHARACTER VARYING(100) NULL

);

--*****************************************************

DROP TABLE IF EXISTS "public"."product_attribute";

CREATE TABLE "public"."product_attribute"
(
"product_id"                INTEGER NOT NULL,
"attribute_value_id"        INTEGER NOT NULL,
"attribute_id"              INTEGER NOT NULL
);

我没有故意添加任何限制。 我需要子表product_attribute.attribute_value_id 上的外键引用父表attribute_value.id。最佳实践是在字段 attribute_value.id 上创建一个主键(可能带有一个序列),或者在 attribute_value.id 上创建唯一索引? 我首先认为索引只是数据库搜索引擎可以用来加速数据检索的特殊查找表。但是当我使用外键时,我发现创建唯一索引可以避免错误“没有唯一约束匹配给定键的引用表 blablabla”,因为外键不应该指向非唯一值。那么是否应该使用索引来创建外键?

我还需要子表product_attribute.attribute_id 上的外键引用父表attribute_value.attribute_id。问题是 attribute_value.attribute_id 不是唯一的。但是product_attribute.attribute_id 中的所有行都不能从attribute_value.attribute_id 的可能值中取出任何值。我该怎么办?

【问题讨论】:

  • 请描述您想要完成的任务。充其量您布置的数据模型非常差。还有一些关于外键和参照完整性的研究/研究。进一步的“外键不应该指向非唯一值”并不完全正确。那必须是“外键不能指向非唯一值

标签: sql database postgresql data-structures


【解决方案1】:

每个表都应该有一个主键。不要加入抱怨表中重复行的人群。

所以将id设为attribute_value的主键,就可以创建外键约束了。

约束由唯一索引实现,因此从技术上讲它们几乎相同。您仍然需要一个约束,而不仅仅是一个唯一索引作为外键约束的目标。

关于attribute_id:这不应该是您问题中两个表之间的外键约束,但两个表都应该有一个外键引用另一个表(attribute?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2020-06-19
    相关资源
    最近更新 更多