【问题标题】:Constraint to table column name (postgresql)对表列名的约束(postgresql)
【发布时间】:2012-06-12 16:38:45
【问题描述】:

我正在使用产品属性的单表继承(可能是以后的类表继承)模型来实现产品数据库。这一切都很好,但我正在尝试找出如何最好地处理产品变体,同时保持参照完整性。

现在我的主要产品表的简化版本如下所示:

CREATE TABLE product (

    id     SERIAL         NOT NULL,
    name   VARCHAR(100)   NOT NULL,
    brand  VARCHAR(40)    NOT NULL,
    color  VARCHAR(40)[]  NOT NULL

)

(颜色是一个数组,因此可以列出任何给定产品的所有标准颜色)

为了处理变体,我考虑在名为 product_variant_theme 的表中跟踪产品变化的属性:

CREATE TABLE product_variant_theme (

    id              SERIAL       NOT NULL,
    product_id      INT          NOT NULL,
    attribute_name  VARCHAR(40)  NOT NULL

)

我在其中插入带有相关 product_id 的行,并将属性的列名添加到 attribute_name 字段中,例如“颜色”。

现在请随时告诉我,这是否是一种完全愚蠢的解决方法,但我担心attribute_name 和实际列名本身之间缺乏约束。显然,如果更改产品表并删除该列,我可能仍会在第二个表中留下引用它的行。我正在寻找的功能等价物类似于attribute_name上的外键到描述表的information_schema视图,但我认为没有任何方法可以直接做到这一点,我想知道是否有任何合理的方式来获得这种功能。

谢谢。

【问题讨论】:

    标签: sql database postgresql database-design constraints


    【解决方案1】:

    你在寻找这样的东西吗?

    product
    =======
    id
    name
    
    
    attribute
    =========
    id
    name
    
    
    product_attribute_map
    =====================
    product_id
    attribute_id
    value
    

    【讨论】:

    • 这将是 EAV 的做法,但它并不真正适合我的需要,因为它会使以后的许多其他查询复杂化。如果您想象我有一个包含名为“column_name”的列的表,其中包含一个字符串值以及另一个表中列的实际名称......如果我从第二个表中删除该列,我希望它级联删除第一个表中具有该列名称的行,如果有意义的话。
    猜你喜欢
    • 2015-06-22
    • 1970-01-01
    • 2016-05-03
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多