【发布时间】: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