最佳数据库实践:使用简单数组还是使用密钥对值?

时间:2015-12-17 17:06:15

标签: ruby-on-rails arrays ruby database activerecord

我需要在数据库中保存某个参数。我们假设在线订单的付款方式。

模型/ order.rb

PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ]
validates :pay_type, inclusion: PAYMENT_TYPES

视图/命令/ _form.rb

f.select :pay_type, Order::PAYMENT_TYPES, prompt: 'Select a payment method'

问题1 :使用简单数组PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ]与具有键/值对PAYMENT_TYPES = [ ["Check", 1], ["Credit card", 2], ["Purchase order", 3] ]的数组有什么优缺点?

问题2 :如果我知道将来会有任何变化(包括更改姓名和组合类别),我应该使用哪一个?数据库值是数字还是文本字符串实际上是否重要?有什么实际区别?

问题3 :我应该使用上面的字符串还是应该使用:符号?如果:符号更好,那么如何使原始字符串可供查看?像PAYMENT_TYPES = [ [:check, "Check"]]这样的东西?我可以使用:具有数字值的符号并且仍然可以使用字符串文本吗?我很困惑。

2 个答案:

答案 0 :(得分:2)

如果您有购买交易表,并且每条记录都有“购买类型”属性(“支票”,“信用卡”或“采购订单”),我可能会有purchase_types数据库中的表而不是编写表:

purchase_type_id (int)    purchase_type_name (string)
-----------------------------------------------------
1                         Cash
2                         Credit Card
3                         Purchase Order

这会将数据放在数据所在的位置:数据库中更容易管理,而不是在源代码中进行硬编码。它更容易修改。 (您可能希望稍后添加“Paypal”... :))它还为您提供两全其美:您的购买表更紧凑(没有冗余的字符串属性条目,因为它使用purchase_type_id)和数据库是自包含的(id的含义在数据中,而不在代码中)。

然后,购买项目的选择器将使用此表格来选择选择框。这是一种常见的Rails模式。

在关于符号的新问题中,您可以在Ruby中轻松地在符号和字符串之间进行转换,因此例如["Check", :check]是多余的。但如果你使用purchase_types表,这是一个没有实际意义的点。

答案 1 :(得分:1)

我不知道你将如何使用第二个选项中子数组中的数字,但很明显使用第二个选项没有意义。

(i)如果要将数组中的项目与唯一编号相关联,可以在第一个选项中使用数组索引,这会使第二个选项中的数字变为冗余。

(ii)此外,如果你有一个扁平数组而不是嵌套数组,那么在数组中查找元素会更容易。

(iii)最后,出于维护原因,第一种选择明显优越;如果你碰巧在数组中添加/删除/更改项目,你仍然可以确保在第一个选项中有一个唯一的连续编号,但在第二个选项中,你必须重新编号。