Mysql 如何处理折扣表?

Mysql 如何处理折扣表?,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我有这些桌子: 类别: name - created_at 产品: id - name - price - quantity - category_id - brand_id 我有这两张表,作为店主,我需要为我的产品创建折扣。 所以我创建了表折扣: 折扣: id - type('percentage','numeric') - value - cancel - expired_at 因此,我需要: 1-对属于例如类别(T恤)的所有产品进行折扣 2-对特定产品或我需要的产品进行折扣 我的嘴:

我有这些桌子:

类别:

name - created_at
产品:

id - name - price - quantity - category_id - brand_id
我有这两张表,作为店主,我需要为我的产品创建折扣。 所以我创建了表折扣:

折扣:

id - type('percentage','numeric') - value - cancel - expired_at
因此,我需要:

1-对属于例如类别(T恤)的所有产品进行折扣

2-对特定产品或我需要的产品进行折扣

我的嘴:

创建了两个数据透视表:

discount_product ( discount_id -  product_id )

discount_category ( discount_id - category_id ) 

这是这样做的最佳实践吗?

您的方法适合您当前的需求,保持两个枢轴保持折扣分离,索引将提高获取数据的速度,但缺点是您需要从两个表中查询以获取所有折扣(速度会稍慢)

以下只是一种可能性,您可以忽略它,但尝试一下阅读它

但我想提几个可能性

  • 如果店主想给某个特定品牌打折怎么办?(假设您同意添加此功能)例如,他希望所有Raymond产品都有折扣?在当前模式下,您需要查找所有具有Raymond的
    品牌id的产品,并在
    折扣产品
    表中为所有这些产品添加单个条目(其实并不难,但表中的数据会变得非常大),或者为品牌创建一个新的透视表
  • 同样,如果店主想要所有雷蒙德(品牌)衬衫(我猜是类别)的折扣,那么他也别无选择,只能对个别产品实行折扣
  • 如果只给特定性别或年龄组打折怎么办
  • 还是衣服尺寸
(好吧,我知道我想得太多了,因为这样的需求机会很低。如果有这么多需求,那么最好使用一个库或切换到wordpress/Magento)

因此,我的观点是,如果您需要更大的灵活性,尽管将这些折扣附加到单个产品似乎是一种简单的解决方法(假设您不为每种类型的折扣创建透视表)(我个人认为这一点也很重要。灵活的项目更容易扩展,未来必须从事该项目的人也会更少地诅咒你)保留单一数据透视表并按类型区分它们不是更好吗?(aaargghh听起来很痛苦……但是吗?)

好的,Laravel为您提供了一个解决方案,。是的,现在您只需要一个数据透视表,让Laravel发挥神奇的作用(好的,它只是将带有名称空间的模型名称存储在类型列中)。如果您不想使用Laravels Polymorph,它会变得更加复杂。您需要一个类型表,将每个类型存储在此表中,然后在透视表中放置一个外键

但是在开始并选择采用这种方法之前,想想你是否真的需要它?(我承认,你的问题中甚至没有提到这一点,我只是提到了它,因为我想得太多了)你确定你只需要这两种类型的折扣吗?你能拒绝任何其他类型的折扣吗?你不在乎谁来收拾你的烂摊子吗?如果你的回答是肯定的,那就坚持你当前的模式


所以,首先,选择你认为更合适的

,非常感谢你的精彩解释!真的很喜欢:)|关于品牌等的问题是的,我也需要这一个来给品牌打折!+我真的很喜欢(多态关系),但我需要哪种类型的关系?我是说多对多还是一对多?或者什么?现在我的表有这样的多态关系:(id-可折扣的类型-可折扣的类型-类型-值-取消-过期的值)是好的还是我需要将类型和值分离到另一个与可折扣的表相关的表?@jamal,你需要一个多态的多对多关系。对于使用多态多对多,您可以使用与问题中相同的产品、类别和折扣表。唯一的变化是透视表。您可以保留一个透视表,该表将具有
id、折扣id、折扣类型、折扣id
。看这张照片。将文档中的post和video表替换为产品表和类别表,用折扣表标记,用折扣表标记。@jamal再次强调,您的原始模式也很好,只是在我的回答中提到的情况下,更难扩展。大多数人通常只使用保持不同数据透视表的简单方法。是的,结构似乎是正确的(但您可能应该交换表名)。试试看,把代码弄乱,没有比把手弄脏更好的学习方法了。还要保留有意义的表名,通过查看表名了解表的用途可以节省大量时间。