【问题标题】:Database design for Promotions and It's Types促销及其类型的数据库设计
【发布时间】:2019-03-08 16:12:32
【问题描述】:

有需要创建可以有多种促销类型的促销表的要求。即优惠券、促销代码、礼品等

问题是在创建促销时,我们如何保存促销类型的外键值,其中每个促销类型都是单独的实体并具有自己的属性。

我心中的决心:

  1. 为每个促销类型创建单独的表,以适应促销和相关类型表之间的关系,例如:Promotion_Coupon_Relation

  2. 在促销表中删除外键约束,并创建一个列,该列将在每次基于类型创建促销时存储外键值。但在这种情况下,关系将不是具体的,而是仅基于促销类型来识别。

促销类型:

PromotypeID、PromoTypeDesc(例如:Coupon、PromoCode、Gifts,未来可能会更多)

促销:

PromotionID、PromotypeID、PromotionTypeReferenceID、EffectiveDate、EndDate、Active

优惠券:

CouponID、CouponName、CouponCOde、CouponTitle、isActive

促销代码:

PromoCodeID、PromoCodeName、PromoCodeText、PromoCodeTitle、isActive

礼物:

GiftID、GiftTitle、GiftDesc、isActive

请指教。

【问题讨论】:

  • 嗨。这是一个常见问题解答。请始终在谷歌上搜索您的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,带和不带您的特定字符串/名称,并阅读许多答案。将您发现的相关关键字添加到您的搜索中。如果您没有找到答案,请发布,使用 1 个变体搜索作为标签的标题和关键字。请参阅向下投票箭头鼠标悬停文本。如果您确实有要发布的非重复代码问题,请阅读并通过minimal reproducible example 采取行动。

标签: sql-server database database-design schema entities


【解决方案1】:

我看到了两种解决方案

总表

所有促销类型都在一个表中。但由于每种促销类型的详细信息都是可变的,因此您必须创建通用列来存储此类属性。嗯,这将是一个 XML 文件的好地方......

  • 餐桌促销:promoid、title、...
  • 表促销类型:promotypeid、名称、attribute1name attribute1value、attribute2name、attribute2value ...、attributenname、attributenname
  • Table Promotion-Type-Relation:promotypeid、promoid

如果只有一种类型可以链接到促销,则不需要促销-类型-关系表。只需在 Promotion 中添加 promotypeid 作为外键即可。

具体表格

每种促销类型都有一个表格。

  • 餐桌促销:promoid、title、...
  • 餐桌礼物:giftid、姓名、...
  • 餐桌优惠券:优惠券ID、名称、...
  • 餐桌促销-礼品-关系:promotypeid、giftid
  • Table Promotion-Coupon-Relation:promotypeid、couponid

如果您只允许每种类型中的 1 个,则也不需要链接表。


讨论

通用表方法在数据库级别更简单,但在代码中可能会变成地狱。假设 Gift 和 Coupon 都有一个到期日期,您可以将属性的名称设置为该日期和某处的值。现在要查询该日期,您必须查看属性名称。

【讨论】:

  • 一旦我们将来有更多的促销类型,具体的表格会一团糟,我会犹豫是否采用 xml 方式。需要集思广益,以保持实体之间的关系完好无损。
  • 如果您使用通用模型,请确保在属性名称上创建索引以确保查询性能最佳。
【解决方案2】:

如果您要在一行中执行此操作,则所有促销的所有字段都需要在表中。我过去曾这样做过,可以反对它。从长远来看,这类解决方案变得非常笨拙。

其他选项是存储元数据/键值对,因此一行将包含类似于以下内容的数据:

  • 主键
  • PromotionType 的外键
  • 密钥类型,例如“PromoType”、“CouponName”、“PromoCodeText”
  • 关联值,例如“BoGoF”、“M&S Offer”、“买一送一”

这些可以被查询和旋转或以 XML 等形式返回。但是在使用和呈现元​​数据时总是会遇到问题。可能值得考虑数据接下来的去向,并将其输出为预格式化的 JSON 或 XML 以供进一步使用。

【讨论】:

  • 那将是一团糟,我不想再使用 xml,因为我们已经有大量的 xml 关系数据。需要一种使用具体的 sql 依赖项来解决这个问题的方法。
  • 我有一个类似的场景,之前我必须删除关系并将多个表的外键存储在一个列中,然后根据 typeid 查询它,这将告诉我们要查询的对应表。
  • 您可以允许多个可执行的可空外键。例如fk_Promotion_id、fk_Coupon_id、fk_PromoCodeID。然后链接到各个表。这些都不是很好的选择,但我认为这可能更接近您的需要?
  • 我确实考虑过这一点,但将来当我们有更多促销类型时,这将需要不必要地创建列。我正在寻找可以使这种关系建立具体联系的东西。
猜你喜欢
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2017-06-30
  • 2011-07-12
  • 2013-11-06
  • 2019-02-25
相关资源
最近更新 更多