如何管理postgresql外键?
我需要一些关于Postgresql的SQL结构的建议 我有两张桌子:如何管理postgresql外键?,sql,database,postgresql,data-structures,Sql,Database,Postgresql,Data Structures,我需要一些关于Postgresql的SQL结构的建议 我有两张桌子: DROP TABLE IF EXISTS "public"."attribute_value"; CREATE TABLE "public"."attribute_value" ( "id" INTEGER NOT NULL, "attribute_id" INTEGER NOT NULL, "value" CHA
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引用父表属性_value.id的外键。最佳做法是在字段属性_value.id上创建主键(可能带有序列),或者在属性_value.id上创建唯一索引?
我首先认为索引只是数据库搜索引擎可以用来加速数据检索的特殊查找表。但当我使用外键时,我发现创建唯一索引可以避免错误“没有唯一约束匹配引用表bla的给定键”,因为外键不应该指向非唯一值。那么应该使用索引来创建外键吗
我还需要在引用父表属性\u value.attribute\u id的子表产品\u attribute.attribute\u id上使用外键。问题是属性\u value.attribute\u id不是唯一的。但是product_attribute.attribute_id中的所有行不能从attribute_value.attribute_id的可能值中取出任何值。我该怎么做?每个表都应该有一个主键。不要加入抱怨表中重复行的人群 因此,将
id
设为attribute\u value
的主键,然后可以创建外键约束
约束是由唯一的索引实现的,因此技术上它们几乎是相同的。仍然需要一个约束,而不仅仅是一个唯一的索引作为外键约束的目标
关于
attribute\u id
:这不应该是问题中两个表之间的外键约束,但两个表都应该有一个外键引用另一个表(attribute
?)。请描述您试图实现的目标。充其量,您所设计的数据模型非常糟糕。还有一些关于外键和引用完整性的研究。此外,“外键不应该指向非唯一值”也不太正确。必须为“外键不能指向非唯一值”。