postgresql 规范化我应该为这个模式创建两个表吗

wljmcqd8  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(114)

我已经阅读了有关规范化,现在希望你问我应该有2个表,它或一个足够。
我有一个这样的对象:

{
            "name": "Farbe",
            "id": 11087368061250,
            "product_id": 8812906250562,
            "position": 1,
            "values": [
                "schwarz",
                "gelb",
                "blau",
                "rot",
                "weiß",
                "lila"
            ]
        },
        {
            "name": "Größe",
            "id": 11087368061250,
            "product_id": 8812906250562,
            "position": 1,
            "values": [
                "22",
                "23",
                "24",
                "25",
                "26",
                "27"
            ]
        },

我想把它放在我的数据库里,所以我有两个选择。在一张或两张table上。
选项1:

CREATE TABLE product_options (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  p_id UUID REFERENCES product(id),
  name VARCHAR,
  position SMALLINT,
  value VARCHAR
)

备选办法2(有两张table)

CREATE TABLE product_options (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  p_id UUID REFERENCES product(id),
  name VARCHAR,
  position SMALLINT
)

CREATE TABLE product_options_value (
  id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  produt_options_id UUID REFERENCES product_options(id),
  value VARCHAR
)

那么你更喜欢什么,哪一个更好?我希望你能解释我哪一个会更好,因为我是新的sql

sg24os4d

sg24os4d1#

应该有两件事:属性本身及其所有可能的值(类似于选项2)和产品的实际属性(具有单个值)。我会像这样对前者建模:

CREATE TABLE option (
  id big GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name text NOT NULL
);

CREATE TABLE option_value (
  option_id bigint REFERENCES product_options,
  value text,
  PRIMARY KEY (options_id, value)
);

与实际产品的关联将是

CREATE TABLE product_option (
  product_id bigint REFERENCES product NOT NULL,
  option_id bigint NOT NULL,
  value text NOT NULL,
  FOREIGN KEY (option_id, value) REFERENCES option_value
);

我选择不向option_value添加人工主键,这意味着option_idvalue都需要在product_option中。如果value是一个长字符串,使用一个人工主键可能是更好的方法,以避免重复长字符串。

相关问题