Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 建模产品变体_Mysql_Database_Database Design_Relational Database_Entity Attribute Value - Fatal编程技术网

Mysql 建模产品变体

Mysql 建模产品变体,mysql,database,database-design,relational-database,entity-attribute-value,Mysql,Database,Database Design,Relational Database,Entity Attribute Value,我一直在尝试建模产品变体,并认为我可能需要使用EAV。我可能没有EAV也能做到,但我担心我可能错过了什么。这是我的设计: 以下是我试图表达的内容: 产品可以有0个或多个产品变体(例如,t恤产品可能有尺寸和颜色变体) 产品变型可以有一个或多个产品变型选项(例如尺寸变型可以是小、中、大) SKU由一个或多个产品变体选项组成(product\u variant\u option\u composition表将包含“product\u variant\u options”的所有可能组合。因此,如果有3

我一直在尝试建模产品变体,并认为我可能需要使用EAV。我可能没有EAV也能做到,但我担心我可能错过了什么。这是我的设计:

以下是我试图表达的内容:

  • 产品
    可以有0个或多个
    产品变体
    (例如,t恤产品可能有尺寸和颜色变体)
  • 产品变型
    可以有一个或多个
    产品变型选项
    (例如尺寸变型可以是小、中、大)
  • SKU
    由一个或多个
    产品变体选项组成
    product\u variant\u option\u composition
    表将包含“product\u variant\u options”的所有可能组合。因此,如果有3种尺寸和3种颜色,则将有3*3=9种组合——每个组合将给出自己的SKU和价格)
  • 产品可以有一个或多个
    SKU
  • 如果产品没有任何变体,则只需忽略
    产品变体
    产品变体选项
    、以及
    产品变体选项组合

    这个设计合理吗?我最终会质疑这个问题吗?它会扩展吗?它是标准化的吗

    更新1

    @埃德珀:

    如果一个产品可以有0个或多个(可选模式)产品变体(例如尺寸、颜色等)。是否意味着一个产品变体也可以有0个或多个具有该变体的产品

    我不这么认为。像“t恤”这样的产品可能有“尺码”变体,而像“裤子”这样的产品也可能有“尺码”变体,但我认为这只是偶然。没有必要让“尺码”只作为一个记录出现,因为“尺码”可能有不同的上下文

    我正在处理的产品差异很大,它们必然有类似的命名变体

    更新2:

    以下是我如何查看数据的示例:

    我已将变量
    Size
    及其相关值装箱。我想明确指出,这些变量不被视为重复数据。这3种产品的
    Size
    变量只是偶然发生的。我认为没有必要对其进行规范化。每种产品都可以有0个或更多的变量,我不知道它们。我希望“重复”(尽管它们并非像在特定产品的上下文中一样真正重复——因此,小部件1的“大小”变量与小部件2的“大小”变量不同)

    更新3:

    我现在明白了,在我的设计中,
    产品
    可能有多个相同的
    产品_变体
    。我认为这可以通过制作
    产品_变体
    产品_变体
    名称
    复合键来解决。这意味着小部件1只能有“大小”“一次

    product\u variant\u options
    product\u variant\u id
    product\u variant\u options
    name
    也需要是复合键

    更新4:

    通过更新我的
    产品变型\u选项\u组合
    以包括
    产品变型\u id
    (FK到
    产品变型
    id
    )通过
    产品变量选项组合
    产品变量选项组合
    实施唯一约束,我认为我能够防止sku既“小”又“大”的问题。这是正确的吗

    -- phpMyAdmin SQL Dump
    -- version 4.1.14
    -- http://www.phpmyadmin.net
    --
    -- Host: 127.0.0.1
    -- Generation Time: Jul 30, 2014 at 03:35 AM
    -- Server version: 5.6.17
    -- PHP Version: 5.5.12
    
    SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
    
    
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    
    --
    -- Database: `mydb`
    --
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `products`
    --
    
    CREATE TABLE IF NOT EXISTS `products` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(45) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
    
    --
    -- Dumping data for table `products`
    --
    
    INSERT INTO `products` (`id`, `name`) VALUES
    (1, 'Widget 1');
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `product_variants`
    --
    
    CREATE TABLE IF NOT EXISTS `product_variants` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `product_id` int(11) NOT NULL,
      `name` varchar(45) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `UNIQUE_product_id_name` (`product_id`,`name`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
    
    --
    -- Dumping data for table `product_variants`
    --
    
    INSERT INTO `product_variants` (`id`, `product_id`, `name`) VALUES
    (2, 1, 'Color'),
    (1, 1, 'Size');
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `product_variant_options`
    --
    
    CREATE TABLE IF NOT EXISTS `product_variant_options` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `product_variant_id` int(11) NOT NULL,
      `name` varchar(45) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `UNIQUE_product_variant_id_name` (`product_variant_id`,`name`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
    
    --
    -- Dumping data for table `product_variant_options`
    --
    
    INSERT INTO `product_variant_options` (`id`, `product_variant_id`, `name`) VALUES
    (2, 1, 'Large'),
    (1, 1, 'Small'),
    (4, 2, 'Black'),
    (3, 2, 'White');
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `skus`
    --
    
    CREATE TABLE IF NOT EXISTS `skus` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `product_id` int(11) NOT NULL,
      `sku` varchar(45) NOT NULL,
      `price` decimal(10,2) NOT NULL,
      PRIMARY KEY (`id`),
      KEY `skus_product_id_products_id_idx` (`product_id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
    
    --
    -- Dumping data for table `skus`
    --
    
    INSERT INTO `skus` (`id`, `product_id`, `sku`, `price`) VALUES
    (1, 1, 'W1SSCW', '10.00'),
    (2, 1, 'W1SSCB', '10.00'),
    (3, 1, 'W1SLCW', '12.00'),
    (4, 1, 'W1SLCB', '15.00');
    
    -- --------------------------------------------------------
    
    --
    -- Table structure for table `skus_product_variant_options`
    --
    
    CREATE TABLE IF NOT EXISTS `skus_product_variant_options` (
      `sku_id` int(11) NOT NULL,
      `product_variant_id` int(11) NOT NULL,
      `product_variant_options_id` int(11) NOT NULL,
      PRIMARY KEY (`sku_id`,`product_variant_options_id`,`product_variant_id`),
      UNIQUE KEY `UNIQUE_sku_id_product_variant_id` (`sku_id`,`product_variant_id`),
      KEY `spvo_product_variant_options_id_pro_idx` (`product_variant_options_id`),
      KEY `spvo_product_variant_id_product_var_idx` (`product_variant_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    --
    -- Dumping data for table `skus_product_variant_options`
    --
    
    INSERT INTO `skus_product_variant_options` (`sku_id`, `product_variant_id`, `product_variant_options_id`) VALUES
    (1, 1, 1),
    (2, 1, 1),
    (3, 1, 2),
    (4, 1, 2),
    (1, 2, 3),
    (3, 2, 3),
    (2, 2, 4),
    (4, 2, 4);
    
    --
    -- Constraints for dumped tables
    --
    
    --
    -- Constraints for table `product_variants`
    --
    ALTER TABLE `product_variants`
      ADD CONSTRAINT `product_variants_product_id_products_id` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    
    --
    -- Constraints for table `product_variant_options`
    --
    ALTER TABLE `product_variant_options`
      ADD CONSTRAINT `product_variant_options_product_variant_id_product_variants_id` FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    
    --
    -- Constraints for table `skus`
    --
    ALTER TABLE `skus`
      ADD CONSTRAINT `skus_product_id_products_id` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    
    --
    -- Constraints for table `skus_product_variant_options`
    --
    ALTER TABLE `skus_product_variant_options`
      ADD CONSTRAINT `skus_product_variant_options_sku_id_skus_id` FOREIGN KEY (`sku_id`) REFERENCES `skus` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      ADD CONSTRAINT `spvo_product_variant_options_id_product_variant_options_id` FOREIGN KEY (`product_variant_options_id`) REFERENCES `product_variant_options` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      ADD CONSTRAINT `spvo_product_variant_id_product_variants_id` FOREIGN KEY (`product_variant_id`) REFERENCES `product_variants` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION;
    
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    


    您可以采用如下设计:

     +---------------+     +-------------------+
     | PRODUCTS      |-----< PRODUCT_VARIANTS  |
     +---------------+     +-------------------+
     | #product_id   |     | #product_id       |
     |  product_name |     | #variant_id       |
     +---------------+     |  sku_id           |
             |             +-------------------+
             |                       |
    +--------^--------+     +--------^--------+
    | PRODUCT_OPTIONS |-----< VARIANT_VALUES  |
    +-----------------+     +-----------------+
    | #product_id     |     | #product_id     |
    | #option_id      |     | #variant_id     |
    +--------v--------+     | #option_id      |
             |              |  value_id       |
    +-----------------+     +--------v--------+
    | OPTIONS         |              |
    +-----------------+              |
    | #option_id      |              |
    |  option_name    |              |
    +-----------------+              |
             |                       |
     +-------^-------+               |
     | OPTION_VALUES |---------------+
     +---------------+
     | #option_id    |
     | #value_id     |
     |  value_name   |
     +---------------+
    
    +---------------+     +---------------+
    | PRODUCTS      |-----< PRODUCT_SKUS  |
    +---------------+     +---------------+
    | #product_id   |     | #product_id   |
    |  product_name |     | #sku_id       |
    +---------------+     |  sku          |
            |             |  price        |
            |             +---------------+
            |                     |
    +-------^-------+      +------^------+
    | OPTIONS       |------< SKU_VALUES  |
    +---------------+      +-------------+
    | #product_id   |      | #product_id |
    | #option_id    |      | #sku_id     |
    |  option_name  |      | #option_id  |
    +---------------+      |  value_id   |
            |              +------v------+
    +-------^-------+             |
    | OPTION_VALUES |-------------+
    +---------------+
    | #product_id   |
    | #option_id    |
    | #value_id     |
    |  value_name   |
    +---------------+
    
    在您的设计中,似乎没有任何东西可以阻止添加记录条目(产品变量选项id:2;sku变量id:1),这样sku W1SSCW现在既有小的选项,也有大的选项。没有任何东西可以阻止记录条目(产品变量选项id:7;sku变量id:1),这样sku W1SSCW也有这个选项

    根据您如何查看数据的电子表格,您可以在我的表格中输入数据,如下所示:

    PRODUCTS
    ========
    id  name
    --- --------
    1   Widget 1
    2   Widget 2
    3   Widget 3
     
    PRODUCT_VARIANTS
    ================
    id  product_id name
    --- ---------- ------
    1   1          Size   (Widget 1)
    2   1          Color  (Widget 1)
    3   2          Size   (Widget 2)
    4   3          Class  (Widget 3)
    5   3          Size   (Widget 3)
     
    PRODUCT_VARIANT_OPTIONS
    =======================
    id  product_variant_id name
    --- ------------------ -------------
    1   1                  Small         (Widget 1; Size)
    2   1                  Large         (Widget 1; Size)
    3   2                  White         (Widget 1; Color)
    4   2                  Black         (Widget 1; Color)
    5   3                  Small         (Widget 2; Size)
    6   3                  Medium        (Widget 2; Size)
    7   4                  Amateur       (Widget 3; Class)
    8   4                  Professional  (Widget 3; Class)
    9   5                  Medium        (Widget 3; Size)
    10  5                  Large         (Widget 3; Size)
     
    SKUS
    ====
    id  product_id sku    price
    --- ---------- ------ -----
    1   1          W1SSCW    10 (Widget 1)
    2   1          W1SSCB    10 (Widget 1)
    3   1          W1SLCW    12 (Widget 1)
    4   1          W1SLCB    15 (Widget 1)
    5   2          W2SS     100 (Widget 2)
    6   2          W2SM     100 (Widget 2)
    7   3          W3CASM    50 (Widget 3)
    8   3          W3CASL    50 (Widget 3)
    9   3          W3CPSM   150 (Widget 3)
    10  3          W3CPSL   160 (Widget 3)
     
    PRODUCT_VARIANT_OPTION_COMBINATIONS
    ===================================
    product_variant_option_id sku_id
    ------------------------- ------
    1                         1      (W1SSCW; Size; Small)
    3                         1      (W1SSCW; Color; White)
    1                         2      (W1SSCB; Size; Small)
    4                         2      (W1SSCB; Color; Black)
    2                         3      (W1SLCW; Size; Large)
    3                         3      (W1SLCW;  Color; White)
    2                         4      (W1SLCB; Size; Large)
    4                         4      (W1SLCB; Color; Black)
    5                         5      (W2SS; Size; Small)
    6                         6      (W2SM; Size; Medium)
    7                         7      (W3CASM; Class; Amateur)
    9                         7      (W3CASM; Size; Medium)
    7                         8      (W3CASL; Class; Amateur)
    10                        8      (W3CASL; Size; Large)
    8                         9      (W3CPSM; Class; Professional)
    9                         9      (W3CPSM; Size; Medium)
    8                         10     (W3CPSL; Class; Professional)
    10                        10     (W3CPSL; Size; Large)
    
    PRODUCTS
    ========
    product_id product_name
    ---------- ------------
    1          Widget 1
    2          Widget 2
    3          Widget 3
     
    OPTIONS
    =======
    option_id option_name
    --------- -----------
    1         Size SL
    2         Color
    3         Size SM
    4         Class
    5         Size ML
     
    OPTION_VALUES
    =============
    option_id value_id value_name
    --------- -------- ------------
    1         1        Small        (Size SL)
    1         2        Large        (Size SL)
    2         1        White        (Color)
    2         2        Black        (Color)
    3         1        Small        (Size SM)
    3         2        Medium       (Size SM)
    4         1        Amateur      (Class)
    4         2        Professional (Class)
    5         1        Medium       (Size ML)
    5         2        Large        (Size ML)
     
    PRODUCT_OPTIONS
    ===============
    product_id option_id
    ---------- ---------
    1          1         (Widget 1; Size SL)
    1          2         (Widget 1; Color)
    2          3         (Widget 2; Size SM)
    3          4         (Widget 3; Class)
    3          5         (Widget 4; Size ML)
     
    PRODUCT_VARIANTS
    ================
    product_id variant_id sku_id
    ---------- ---------- ------
    1          1          W1SSCW (Widget 1)
    1          2          W1SSCB (Widget 1)
    1          3          W1SLCW (Widget 1)
    1          4          W1SLCB (Widget 1)
    2          1          W2SS   (Widget 2)
    2          2          W2SM   (Widget 2)
    3          1          W3CASM (Widget 3)
    3          2          W3CASL (Widget 3)
    3          3          W3CPSM (Widget 3)
    3          4          W3CPSL (Widget 3)
     
    VARIANT_VALUES
    ==============
    product_id variant_id option_id value_id
    ---------- ---------- --------- --------
    1          1          1         1        (W1SSCW; Size SL; Small)
    1          1          2         1        (W1SSCW; Color; White)
    1          2          1         1        (W1SSCB; Size SL; Small)
    1          2          2         2        (W1SSCB; Color; Black)
    1          3          1         2        (W1SLCW; Size SL; Large)
    1          3          2         1        (W1SLCW; Color; White)
    1          4          1         2        (W1SLCB; Size SL; Large)
    1          4          2         2        (W1SLCB; Color; Black)
    2          1          3         1        (W2SS; Size SM; Small)
    2          2          3         2        (W2SM; Size SM; Medium)
    3          1          4         1        (W3CASM; Class; Amateur)
    3          1          5         1        (W3CASM; Size ML; Medium)
    3          2          4         1        (W3CASL; Class; Amateur)
    3          2          5         2        (W3CASL; Size ML; Large)
    3          3          4         2        (W3CPSM; Class; Professional)
    3          3          5         1        (W3CPSM; Size ML; Medium)
    3          4          4         2        (W3CPSL; Class; Professional)
    3          4          5         2        (W3CPSL; Size ML; Large)
    
    PRODUCTS
    ========
    product_id product_name
    ---------- ------------
    1          Widget 1
    2          Widget 2
    3          Widget 3
     
    OPTIONS
    =======
    product_id option_id option_name
    ---------- --------- -----------
    1          1         Size        (Widget 1)
    1          2         Color       (Widget 1)
    2          1         Size        (Widget 2)
    3          1         Class       (Widget 3)
    3          2         Size        (Widget 3)
     
    OPTION_VALUES
    =============
    product_id option_id value_id value_name
    ---------- --------- -------- ------------
    1          1         1        Small        (Widget1; Size)
    1          1         2        Large        (Widget1; Size)
    1          2         1        White        (Widget1; Color)
    1          2         2        Black        (Widget1; Color)
    2          1         1        Small        (Widget2; Size)
    2          1         2        Medium       (Widget2; Size)
    3          1         1        Amateur      (Widget3; Class)
    3          1         2        Professional (Widget3; Class)
    3          2         1        Medium       (Widget3; Size)
    3          2         2        Large        (Widget3; Size)
     
    PRODUCT_SKUS
    ============
    product_id sku_id sku
    ---------- ------ ------
    1          1      W1SSCW (Widget 1)
    1          2      W1SSCB (Widget 1)
    1          3      W1SLCW (Widget 1)
    1          4      W1SLCB (Widget 1)
    2          1      W2SS   (Widget 2)
    2          2      W2SM   (Widget 2)
    3          1      W3CASM (Widget 3)
    3          2      W3CASL (Widget 3)
    3          3      W3CPSM (Widget 3)
    3          4      W3CPSL (Widget 3)
     
    SKU_VALUES
    ==========
    product_id sku_id option_id value_id
    ---------- ------ --------- --------
    1          1      1         1        (W1SSCW; Size; Small)
    1          1      2         1        (W1SSCW; Color; White)
    1          2      1         1        (W1SSCB; Size; Small)
    1          2      2         2        (W1SSCB; Color; Black)
    1          3      1         2        (W1SLCW; Size; Large)
    1          3      2         1        (W1SLCW; Color; White)
    1          4      1         2        (W1SLCB; Size; Large)
    1          4      2         2        (W1SLCB; Color; Black)
    2          1      1         1        (W2SS; Size; Small)
    2          2      1         2        (W2SM; Size; Medium)
    3          1      1         1        (W3CASM; Class; Amateur)
    3          1      2         1        (W3CASM; Size; Medium)
    3          2      1         1        (W3CASL; Class; Amateur)
    3          2      2         2        (W3CASL; Size; Large)
    3          3      1         2        (W3CPSM; Class; Professional)
    3          3      2         1        (W3CPSM; Size; Medium)
    3          4      1         2        (W3CPSL; Class; Professional)
    3          4      2         2        (W3CPSL; Size; Large)
    
    在我的设计中,您无法输入额外的变量值记录(产品id:1;变量id:1;选项id:1;值id:2)-因此SKU W1SSCW现在既有小的选项,也有大的选项-由于变量值上的主键和现有的变量值记录(产品id:1;变量id:1;选项id:1;值id:1).在我的设计中,您无法输入变量值记录(产品id:1;变量id:1;选项id:4;值id:1)-因此SKU W1SSCW也有业余选项-由于外键引用产品选项,并且此表中缺少记录(产品id:1;选项id:4)指示类是产品小部件1的有效选项

    编辑:无产品选项表的设计


    您可以采用如下设计:

     +---------------+     +-------------------+
     | PRODUCTS      |-----< PRODUCT_VARIANTS  |
     +---------------+     +-------------------+
     | #product_id   |     | #product_id       |
     |  product_name |     | #variant_id       |
     +---------------+     |  sku_id           |
             |             +-------------------+
             |                       |
    +--------^--------+     +--------^--------+
    | PRODUCT_OPTIONS |-----< VARIANT_VALUES  |
    +-----------------+     +-----------------+
    | #product_id     |     | #product_id     |
    | #option_id      |     | #variant_id     |
    +--------v--------+     | #option_id      |
             |              |  value_id       |
    +-----------------+     +--------v--------+
    | OPTIONS         |              |
    +-----------------+              |
    | #option_id      |              |
    |  option_name    |              |
    +-----------------+              |
             |                       |
     +-------^-------+               |
     | OPTION_VALUES |---------------+
     +---------------+
     | #option_id    |
     | #value_id     |
     |  value_name   |
     +---------------+
    
    +---------------+     +---------------+
    | PRODUCTS      |-----< PRODUCT_SKUS  |
    +---------------+     +---------------+
    | #product_id   |     | #product_id   |
    |  product_name |     | #sku_id       |
    +---------------+     |  sku          |
            |             |  price        |
            |             +---------------+
            |                     |
    +-------^-------+      +------^------+
    | OPTIONS       |------< SKU_VALUES  |
    +---------------+      +-------------+
    | #product_id   |      | #product_id |
    | #option_id    |      | #sku_id     |
    |  option_name  |      | #option_id  |
    +---------------+      |  value_id   |
            |              +------v------+
    +-------^-------+             |
    | OPTION_VALUES |-------------+
    +---------------+
    | #product_id   |
    | #option_id    |
    | #value_id     |
    |  value_name   |
    +---------------+
    

    如果不同产品中没有那么多类似的变体,那么您的设计是好的。但是,当用户选择变体时,它是来自预填充的
    组合框
    ,还是来自绑定到
    组合框
    的参考表?如果是后者,那么为什么参考表没有显示在中你的设计?但你的设计已经相当不错了。用户不会“选择”变体。相反,他们将“指定”变体(并且他们可以指定任何他们想要的)。在我看来,SKU是产品变体的属性。产品变体是产品选项值的特定组合。您似乎已将SKU链接到单个产品选项值,例如衬衫红色,而不是衬衫小红等值的组合。我的设计将可能的选项从哪个选项组合中分割出来实际可用的属性,即蓝色小衬衫可能实际上不可用。PKs是#属性,因此有一些复合主键,如PRODU