订单数据冗余

时间:2019-03-27 08:52:38

标签: mysql sql mysqli pdo

order_detail:

  

order_no | product_id

product_detail:

  

prod_id | prod_name | prod_size | prod_type

order_detail .product_id  references to product_detail.prod_id

我听说数据冗余是个坏主意,所以我内部连接了表格以显示完整的订单详细信息。但是问题在于product_detail中的数据可以由admin编辑或删除,这意味着当我内部联接表时,它可能返回null。我是否应该在{size:23,type:MZ}中存储类似JSON的示例:order_detail,以避免数据“丢失”?

2 个答案:

答案 0 :(得分:0)

您将需要分解表结构。

必须在order_detail表中以JSON格式存储数据,这会损害数据库上的normalization(这是不希望的)。

将产品属性设为单个实体。

  • 产品详情
  

id |名称| some_other_descriptive_columns | Deleted_at

  • 产品类型:
  

id |输入

  • 产品尺寸:
  

id |大小

  • Product_type_mapping:(数据透视表表示产品与其类型之间的多对多关系)
  

id | product_id | product_type_id | Deleted_at

  • Product_size_mapping:(数据透视表表示产品与其尺寸之间的多对多关系)
  

id | product_id | product_size_id | Deleted_at

  • 您可能已经注意到,我们还有一个名为deleted_at的列,其数据类型将为timestamp,并且在上面显示的所有表中默认为nullable

  • 当管理员编辑(也可以删除某些尺寸或类型)或删除产品时,我们要做的就是在deleted_at列中输入时间戳。换句话说,我们进行了软删除

  • 因此,当管理员对产品数据集进行操作时,请提取其deleted_at列为NULL的所有详细信息。在进行内部联接以获取订单详细信息时,即使管理员在下订单后几天后删除了产品,也不会阻止丢失任何数据的过程,因为我们将获取所有详细信息,无论我们在{ {1}}列。

答案 1 :(得分:0)

我建议您考虑使用类似图中的模式。 (箭头是PK-FK关系的“许多”末端。)

这种方法通过在单独的表中记录删除内容来保持引用完整性,并避免使用null。

您可能还想添加“ ProductDataChangedOnDate”功能,以记录该讨厌的管理员所做的更改:-)

5NF solution