在建模数据库时如何处理“特殊情况”数据?

时间:2008-12-05 20:27:15

标签: database data-modeling

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

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

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

8 个答案:

答案 0 :(得分:4)

请注意,此列是显示给客户的价格,可以包含任何内容。

如果您尝试将其设为数字​​列,则会引发悲伤。你已经在努力解决两个不合格的价值观了,明天你的老板可能会想要更多......

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

你明白了。

如果您确实需要数字列,请将其命名为 internalPrice 或其他内容,并将数字约束放在该列上。

答案 1 :(得分:4)

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

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

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

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

通过这种方式,您可以在可能的情况下计算订单的价格,并在未指定价格时将其保留,但同时显示两者。我还会制定一个公交规则,以确保在定价通知得到解决之前总计无法计算总额(您还必须有一种方法可以将特殊定价插入订单详细信息而不是仅仅从价格表)。

答案 2 :(得分:2)

问问自己......

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

OR

我是否只是在网页上显示此值?

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

答案 3 :(得分:1)

也许在主表中使用'type'指示符,其中一个子表允许数字价格而另一个子表具有字符值。这些可以组合成一个表,但我通常会避免这种情况。如果您想要根据购买数量定价,您也可以使用具有数量的中间链接表。

答案 4 :(得分:1)

很多选择:

  1. 所有价格存储为varchars
  2. 以数字形式存储的价格和额外的price_display字段,如果已填充
  3. ,则覆盖该数字
  4. 为了显示目的而存储的价格和额外的price_display字段在数字价格更新时手动填充或触发(数据重复且可能不同步 - yuk)
  5. 存储映射到特殊情况的特殊情况负价格(简称yuk !!)
  6. varchar price,前缀键字段到可用前缀表('cost +',...),后缀键字段到可用后缀表,键入字段键到价格值的类型列表( '$','%','description')。如果你将来需要针对价格编写复杂的查询,这很有用。
  7. 我可能会选择2作为一个实用的解决方案,如果我需要一些非常通用的通用定价系统,我可能会扩展为5。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:1)

因为至少有一个替代价格涉及一个数字,价格列,价格类型怎么样?正常条目可以是美元值的数字并输入'dollar',另一个可以是8和'PercentOverCost'以及null和'ISA'(对于Price和PriceType列)。

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

这将允许在未来添加其他类型的定价(单位定价,foriegn currancy),给你一个数字,并且还可以更容易地知道你正在处理什么类型的定价..

答案 7 :(得分:0)