我应该如何向用户提供成本字段,并将其存储在数据库中?

Ton*_*ony 1 ruby database ruby-on-rails

现在我有两个成本领域.一个用于美元,一个用于美分.这有效,但有点难看.它也不允许用户输入术语"免费"或"无成本",如果他们想要的话.但是如果我只有一个字段,我可能需要让我的解析器更聪明一些.你怎么看?

在服务器端,我结合美元和美分将它们存储为我的数据库中的小数.主要是为了让我能够快速收集统计数据(成本平均值等).

您认为将成本存储为字符串会更好吗?然后每当我实际使用统计数据或其他目的的成本时,我会在那时将其转换为小数.还是我走在正确的轨道上?

Mik*_*scu 8

数据库设计中有一条规则规定不应拆分"原子数据".根据这个规则,价格或成本就是原子数据的一个例子,因此它绝不应该分成多个列,就像你不应该在多个列之间拆分一个电话号码一样(除非你真的有很好的理由 - 极少)

使用DECIMAL数据类型.像DECIMAL(8,3)这样的东西应该可以运行,所有符合ANSI SQL的数据库产品都支持它!

您可以参考Joe Celko的"Thinking In Sets"一书来讨论这个主题.见第1.6.2节,第21-22页.

编辑 - 从您的问题看来,您还关注如何以类似于价格(xxxx.xx)的形式接受用户的输入 - 因此两个输入框,全部美元和便士.

我建议使用单个输入框然后使用正则表达式进行输入验证以匹配您的格式(例如[0-9] +(.[0-9] {1,3})?可能会起作用但可以改进).然后,您可以将验证过的字符串解析为您的语言中的Decimal类型,或者只是将其作为字符串传递到数据库中 - SQL将知道如何将其转换为DECIMAL类型.