5

我们的组织为我们的客户提供各种服务(例如,网络托管、技术支持、定制编程等)。我们网站上有一个页面列出了所有可用的服务及其相应的价格。这是静态数据,但我的老板希望它全部从数据库中提取。

列出了大约 100 项服务。然而,其中只有两个具有“价格”的非数字值(特别是字符串“ISA”和“成本 + 8%”——我真的不知道它们应该是什么意思,所以不要问我)。

我不想仅仅因为这两个列表就将“价格”列设为 varchar。我目前的方法是创建一个特殊的“price_display”字段,该字段要么为空白,要么包含要显示的文本来代替价格。这个解决方案感觉太像一个肮脏的黑客(它会使查询不必要地复杂化),那么有更好的解决方案吗?

4

8 回答 8

4

考虑到此列是向客户显示的价格,可以包含任何内容。

如果你试图把它变成一个数字列,你会招来悲伤。你已经在两个不合规的价值观上苦苦挣扎,明天你的老板可能想要更多……

  • 申请价格!
  • 打电话给我们今天特别!

你明白了。

如果您确实需要一个数字列,则将其称为internalPrice或其他名称,然后将您的数字约束放在该列上。

于 2008-12-05T20:48:08.220 回答
4

当我过去不得不做这种事情时,我用过:

Price   Unit   Display
10.00   item   null
100.00  box    null
null    null   "Call for Pricing"

价格将是十进制数据类型(任何精确的数字,不是浮点数或实数),单位和显示将是某种类型的字符串数据类型。

然后使用 case 语句以单价或显示器显示价格。还要在显示列上放置一个约束或触发器,使其必须为空,除非价格为空。如果 price 不为 null,则约束或触发器也应该需要单位值。

这样,您可以在可能的情况下计算订单的价格,并在未指定价格但同时显示两者时将其排除在外。我还制定了一项业务规则,以确保在解决定价要求之前无法总计总计(您还必须有一种方法将特殊定价插入到订单详细信息中,而不是仅仅从价格表)。

于 2009-07-20T19:32:24.340 回答
2

问你自己...

我会添加这些值吗?我会按价格排序吗?我需要转换成其他货币价值吗?

或者

我会在网页上显示这个值吗?

如果这只是一个洗衣清单而不用于计算,最简单的解决方案是将价格存储为字符串(varchar)。

于 2008-12-05T20:48:23.510 回答
1

也许在主表中使用“类型”指示符,一个子表允许数字价格,另一个子表允许字符值。这些可以合并到一张表中,但我通常避免这样做。如果您想根据购买的数量确定价格,您也可以使用带有数量的中间链接表。

于 2008-12-05T20:38:33.403 回答
1

很多选择:

  1. 所有价格都存储为 varchars
  2. 以数字形式存储的价格和额外的 price_display 字段,如果填充,则覆盖该数字
  3. 以数字方式存储的价格和用于显示目的的额外 price_display 字段手动填充或在更新数字价格时触发(数据重复并且可能不同步 - yuk)
  4. 存储映射到特殊情况的特殊情况负价格(简直是哇!!)
  5. varchar price,可用前缀表的前缀键字段('cost +',...),可用后缀表的后缀键字段,价格类型列表的类型字段键('$' , '%', '描述')。如果您将来需要针对价格编写复杂的查询,这很有用。

我可能会选择 2 作为一个实用的解决方案,如果我需要通用定价系统的一些非常通用的东西,我可能会选择 5 的扩展。

于 2008-12-05T20:38:50.253 回答
1

如果这是您的数据模型的范围,那么 varchar 字段就可以了。无论如何,您的正常价格(可能是小数)可能对计算毫无用处。您如何比较“数据传输”10 美元/GB 和“域托管”25 美元/月?

这个特定项目的数据模型不是关于定价,而是关于显示定价。考虑到这一点进行设计。

当然 - 如果您要存储特定客户为特定项目支付的价格,或者试图弄清楚向特定客户收取什么费用 - 那么您有一个不同的(更复杂的)域。你需要一个不同的模型来支持它。

于 2008-12-05T20:50:06.720 回答
1

至少其中一个替代价格涉及一个数字,那么价格列,价格类型呢?正常条目可以是美元值和类型“dollar”的数字,另一个可以是 8 和“PercentOverCost”以及 null 和“ISA”(用于 Price 和 PriceType 列)。

如果你走这条路,你可能应该有一个 PriceType 表来验证和 PriceTypeID。

这将允许将来添加其他类型的定价(单位定价,外币),给你一个数字,也让你更容易知道你正在处理什么类型的定价。

于 2008-12-05T21:06:30.697 回答