我正在努力解决 MySQL 5.7 的数据库设计以解决以下情况:
类别维度每天都在变化,我将它们存储在 category_entities 中。它们属于与商家及其产品相关的类别:
商人
merchant_id | merchant
1 | amazon
2 | ebay
PK: merchant_id
产品
prod_id | merchant_id | product
1 | 1 | jumper big
2 | 1 | hat red
3 | 2 | shoe black
3 | 1 | shoe black2
PK: merchant_id, prod_id
类别
cat_id | merchant_id | category
1 | 1 | jumpers in green
2 | 1 | hats for woman
3 | 1 | shoes
4 | 2 | jumpers
5 | 2 | hats for children
6 | 2 | shoes
PK: cat_id
category_entities(30M 行)
cat_id | prod_id | characteristica | date
1 | 1 | 23 | 2021-01-07
2 | 2 | 22 | 2021-01-07
1 | 2 | 22 | 2021-01-08
2 | 3 | 01 | 2021-01-08
3 | 1 | 22 | 2021-01-08
4 | 2 | 01 | 2021-01-08
PK: cat_id, prod_id, date
所以类别表定义了存在的类别,而 category_entities 表显示了每一天的值
如何使用 prod_id、merchant_id 在表产品的表(类别、类别实体)上设置外键。这些字段是产品的主键。
我正在阅读多态关联,但我不确定这是一个以及如何解决这个问题。
我将添加一个部分答案,因为评论中的信息太多。我并不是说这是最好的解决方案,但除非你想改造,否则这是一种可能。鉴于您提供的事实,您可以将 category_entities 扩展为:
现在,您可能在 category 和 category_entities 之间有不一致的 Mercer_id 信息。您可以通过在类别中添加唯一约束来防止这种情况:
现在您可以在 category_entities 中将此约束引用为:
这将保证 category 和 category_entities 之间的一致性,但有点难看,因为 ak1_categories 是一个可约键。
我听说存在允许对子查询进行 CHECK 约束的 DBMS,但我从未使用过。除了 MySQL 5.7 之外,它不关心检查约束,因此这不是您的选择。
另一种选择是在触发器之前添加用于验证商家 ID。但是,它们本质上是程序性的,因此它们不会告诉您有关当前情况的任何信息。您所知道的是,只要它们处于活动状态,就没有无效数据通过它们。
如前所述,这不是一个完整的答案,但提出了一些不适合评论的想法。