使用哪种关系模型来存储依赖于其他值的值?

时间:2019-03-31 21:46:03

标签: mysql sql

我已经完成的任务:

实施产品折扣功能,其中折扣金额取决于不同的条件,例如:

  1. 折扣金额取决于产品类别(电话,电视,PC);
  2. 折扣金额取决于产品制造商(苹果,三星,索尼);
  3. 折扣金额取决于客户类型(注册/来宾);

假定我们只需要满足第一个条件,即每个制造商的折扣金额-我认为这是一对一关系的纯示例,其中每个制造商都定义了自己的折扣。

从数据库架构的角度来看,我们可以通过两种方式轻松实现这一部分:

  1. 一个包含2列的表MANUFACTURER_DISCOUNT:MANUFACTURER_NAME(类型为ENUM)和DISCOUNT_AMOUNT(类型为LONG);
  2. 或带有2个表MANUFACTURER(MANUFACTURER_NAME,ID)和DISCOUNT(DISCOUNT_AMOUNT,MANUFACTURER_ID);

但是,如果我只有一个以上的标准(每个制造商的折扣),我该怎么办?

如何正确构建表的结构?

  • 我是否只需要用其他列(如PRODUCT_CATECORY,CUSTOMER_TYPE)扩展我作为选项1描述的表,或者存在更优雅,更正确的解决方案?

1 个答案:

答案 0 :(得分:0)

每个折扣都应该有自己的表格。

然后,折扣查询量变为:

SELECT IFNULL(cd.discount, 0) + IFNULL(md.discount, 0) + IFNULL(custd.discount, 0) as discount
FROM product p
LEFT JOIN category_discount cd
 ON p.category = cd.category
LEFT JOIN manufacturer_discount md
 ON p.manufacturer = md.manufacturer
LEFT JOIN customer_discount custd
 ON p.customer_type = custd.customer_type

请注意,JOIN比折扣的确切计算更为重要,请记住,NULL是一个未找到的值,需要考虑。

保留表格仅用于一个目的。放置多种折扣类型可能会变得很混乱,因为您需要多个行。具有一对一关系的多个表也最终成为不必要的麻烦。

如果对表结构有疑问,请开始在这些表上写出所需的查询。通常,哪种表结构会导致此时的简单查询变得很明显。