当前位置: 首页 > 面试题库 >

数据库设计集思广益:售价

盛浩阔
2023-03-14
问题内容

我需要创建一个数据库解决方案以提供产品折扣。

当前表:

Products
Columns: ProductId, ProductTypeId, ReleaseDate

ProductPrices
Columns: ProductPriceId, ProductPriceTypeId (one product may have n prices), ProductId, Price

我们希望能够按ProductId和/或ProductTypeId和/或ProductPriceTypeId和/或ReleaseDate打折。

销售示例:

  1. 折扣单个ProductId。
  2. 折扣指定ProductTypeId和ProductPriceTypeId的所有产品。
  3. 在上个月内使用ReleaseDate折扣指定ProductTypeId的所有产品。

#2具有挑战性的方面不是字面上的示例,而是在将来添加新字段的情况下考虑长期可伸缩性。

由于ReleaseDate,我很困惑如何处理#3。

下面是我意识到需要加入Stackoverflow之前在脑海中思考的问题。您会看到,由于明确包含了列,因此刚性结构将不允许良好的可伸缩性-
如果将来我们添加新条件,则需要将这些列添加到表中-更不用说它甚至不能处理ReleaseDate要求。

新表:

ProductPriceDiscounts
Columns: ProductPriceDiscountId, ProductPriceId, ProductTypeId, ProductPriceTypeId, Discount, DiscountTypeId (1 for percentage, 2 for fixed)

然后,我可以使用类似这样的方法来获取价格:

from p in Products
join pp in ProductPrices on p.ProductId equals pp.ProductId
let ppd = (
    from ppd in ProductPriceDiscounts
        .WhereIf(ppd.ProductPriceId != null, ppd.ProductPriceId == pp.ProductPriceId)
        .WhereIf(ppd.ProductTypeId != null, ppd.ProductTypeId == pp.ProductTypeId )
        .WhereIf(ppd.ProductPriceTypeId != null, ppd.ProductPriceTypeId == pp.ProductPriceId)
    select ppd).FirstOrDefault()
where p.ProductId = productId
select new 
{
    ...,
    Price = pp.Price,
    Discount = pp.Discount,
    DiscountedPrice = 
        (ppd.DiscountTypeId == 1) ? 
            (pp.Price - (pp.Price * pp.Discount)) :
            (pp.Price - pp.Discount) :
}

我仅提供了一个我想出的错误示例,以展示最终需要如何使用此新产品折扣功能的结果。任何人都可以提供建议来解决这种情况的好方法吗?谢谢。


问题答案:

我最终使用了原始设计,当我使用linq to sql查询数据库时,我使用一种方法获得了“
DiscountedPrice”。该方法运行自己的查询并在返回结果之前对其执行条件逻辑。因此,这使我可以选择让我的代码执行我的查询无法执行的其他工作。我还为特殊的ProductPriceDiscountIds创建了一个Enum类,以便可以轻松识别它们。我希望这对发现自己处于类似情况的其他人有所帮助-
到目前为止,对于我来说,它工作得很好。



 类似资料:
  • 1、数据库设计最起码要占用这个项目开发的40%以上的时间 2、数据库设计不仅仅停留在页面demo的表面 页面内容所需字段,在数据库设计中只是一部分,还有系统运转、模块交互、中转数据、表之间的联系等等所需要的字段,因此数据库设计绝对不是简单的基本数据存储,还有逻辑数据存储。 3、数据库设计完成后,项目80%的设计开发都要存在你的脑海中 每个字段的设计都要有他存在的意义,要清楚的知道程序中如何去运用这

  • 在《数据库设计概述》一节,我们讲解了为什么需要设计数据库。本节主要介绍数据库设计的基本步骤。 在了解数据库设计步骤之前,我们先来了解一下软件项目的开发周期,如下: 需求分析 概要设计 逻辑设计/详细设计 代码编写 软件测试 安装部署 其中,项目开始的第一步都是根据客户需求去设计数据库。代码编写阶段就是根据选择的数据库进行物理实现,编写代码实现应用。 按照规范设计的方法,考虑数据库及其应用系统开发全

  • 数据库设计就是根据业务系统的具体需求,结合我们所选用的数据库,建立好表结构及表与表之间的管理关系,为这个业务系统构造出最优秀的数据存储模型的过程。使之能有效的对应用的数据进行存储,并高效的对已经存储的数据进行访问。 数据库设计是数据库系统中的重要组成部分。一个良好的数据库可以给系统带来清晰的数据统计与数据的详细分析,给系统带来方便直观的数据。不良的数据库设计,必然会造成很多问题,轻则增减字段,重则

  • 设计工具 所有的数据库设计必须采用PowerDesigner 16.5进行设计 设计规范 所有的表、字段,code必须采用英文命名,不允许采用中文拼音或者缩写。表的name必须为中文命名。 所有的表必须包含id(VARCHAR2 128 BYTE)、create_time(DATETIME,自动更新)、last_update_time(DATETIME,自动更新)三个字段

  • 【注意】下列选项和选项卡会根据服务器版本而有所不同。 常规属性 角色名 定义数据库角色的名。 所有者 指定数据库角色的所有者。 成员属于 在列表里,指定此数据库角色成为已选择的数据库角色的成员。 成员 在列表里,指定已选择的数据库用户和角色成为此数据库角色的成员。 拥有的模式 在列表里,勾选数据库角色拥有的模式。 数据库权限 在网格中,勾选“权限”列出的数据库权限,勾选“授予”、“含授予选项”或“

  • 【注意】下列选项和选项卡会根据服务器版本和用户类型而有所不同。 常规属性 用户名 定义数据库用户的名。 验证 选择数据库用户的安全类型。 登录名 指定数据库用户使用的 SQL Server 登录。 默认模式 选择将拥有此数据库用户创建之对象的默认模式。 证书名 选择要用于数据库用户的证书。 非对称密钥名 选择要用于数据库用户的非对称密钥。 角色 在列表里,指定此数据库用户成为已选择的数据库角色的成