如何根据选中的值或(全部)存储数据的id

时间:2016-11-29 07:32:17

标签: mysql database database-design

说,我有100种产品的电子商务。现在,我正在为顾客提供优惠券。优惠券可用于部分产品或所有产品。

所以,我现在的表格是这样的:

|      Voucher   |
------------------
| id             |
| voucher_number |
| created_at     |
| expired_date   |
| status         | (available, unavailable)

| Voucher_detail |
------------------
| id             |
| id_voucher     |
| product_id     |

所以,问题是,如果优惠券设置为可用于所有产品。 voucher_detail中将有100条记录,因为有100种产品。这不是浪费,因为优惠券只能用于一种产品。

还是有另一个数据库设计比这个更好?

2 个答案:

答案 0 :(得分:0)

嗯,我不认为你的情况有更好的设计。我的意思是,在设计数据库时,它应该适合所有用例,这样就可以覆盖它们。

当然,拥有所有产品的凭证时,它需要100行,但这非常适合您拥有5种产品的凭证的情况,并且这是一种安全可靠的方式来确切地知道每个凭证的内容它可以使用的产品。

正在考虑,也许你可以将所有产品都用在凭证中,在一个列中,用','分隔,然后在阅读时将它们分开(如果你真的关心大小),但这感觉不对。

答案 1 :(得分:0)

你可能不会产生超过2 ^ 100-1种可能组合的一小部分,对吗?也许你只有少数,它们可以列为“全部”,“服装”,“汽车”等等?如果这样思考那就好了。

如果您确实需要100个事物的真/假,请考虑SET数据类型。由于它限制为64位,因此至少需要2 SET列。同样,您可以决定以某种逻辑方式对这些位进行“分组”。每个项目一位,我们谈论的是整个100个选项的十几个字节。

“all”可能会表示每个位都在。

使用SET方法,您将拥有100个案例中每个案例的字符串名称。 SET可以是它们的任意组合。请在SET上学习手册;操纵有点奇怪。