【问题标题】:How to work with discounts in RavenDB如何在 RavenDB 中使用折扣
【发布时间】:2013-07-06 09:00:52
【问题描述】:

我想在 RavenDB 中实现产品折扣功能。

产品文档:

{
  "RegularPrice": 10.00,
  "ReferencePrice": 0.0,
  "Categories": [
    "A",
    "B",
    "C"
  ]
}

例如,现在我想为“A”类的所有产品打折。 因此,我在折扣文档中将类别映射到折扣率,如下所示:

{
  "ProductDiscount": {
    "A": 20.0
  }
}

问题是我如何计算 ReferencePrice 并在以下情况下存储或更新它:

  • 添加了新产品?
  • RegularPrice 更新了吗?
  • 折扣文档更新了吗?

看来我应该用触发器来处理这个问题。但我不确定!

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    我不确定这个模型是否能撑得住。您将如何将产品与折扣联系起来?它们是按类别相关的,但在此模型中,它是多对多的关系。这是你想要的吗?如果是这样,您将如何处理可能适用于同一产品的多个折扣?

    如果您要这样保留它,您可以考虑的一种策略是使用 multi-map/reduce 来计算价格,然后 Indexed Properties Bundle 将结果写回文档。但这是一个相当复杂的设置。

    您可以通过为每个类别设置一个折扣并将折扣定义为类别文档的一部分来简化此操作。然后,您可以使用LoadDocument 在索引时获取类别的折扣。

    您需要试验一个符合您的要求的模型并且您可以维护。

    其他想法:

    • 是的,您可以使用trigger,但这会在服务器端作为插件运行。可能很难维护。

    • 您可以在应用类别折扣的任何时候手动发送scripted patch request。新文档和对现有文档的编辑必须在您自己的代码中手动完成。

    • 您可以完全不考虑产品的计算价格。每当加载产品时,您都会将折扣包括在内并即时计算价格。

    我敢肯定,还有其他人。这实际上取决于您的特定应用中的工作原理。

    【讨论】:

    • 感谢您的回复。事实上,一个产品与多个类别相关。如果有多个折扣,将设置最低计算价格。好的建议和想法,但其中一些在我的上下文中没有用。 - 在索引时使用 LoadDocument 不会更新文档 - 触发器是一个选项,但维护将是一个问题(此外,我不知道如何使用触发器实现解决方案) - 脚本化补丁请求也是一个选项,但我更喜欢避免手动工作的机制。 - 在运行时计算价格是不可取的......
    • 所以还剩下一个选项;索引属性包。我尝试了以下方法:将计算(折扣)价格的索引:Map = products => from p in products from c in p.Categories select new { ProductId = p.Id, ReferencePrice = p.RegularPrice * ((100 - LoadDocument<Discount>("Discount/" + c).Amount) / 100) }; ...
    • 还有一个在产品文档属性上映射索引字段的文档
    • documentstore.DatabaseCommands.Put("Raven/IndexedProperties/" + discountsIndex.IndexName, null, RavenJObject.FromObject(new IndexedPropertiesSetupDoc { DocumentKey = "ProductId", FieldNameMappings = { { "ReferencePrice", "ReferencePrice" } } }), new RavenJObject());
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多