两张桌子上的许多布尔

时间:2011-10-03 01:58:01

标签: mysql ruby-on-rails boolean

使用Rails 2.1和Mysql。

我有corporation modelhas_many companies

当然是company modelbelongs_to corporation

我需要在这两个表中添加相当多的布尔列,但这感觉非常错误。每张桌子都有相同的布尔值,我们先检查公司是否属实,然后是公司。所以,我能看到的选项是:

  • 将布尔值添加到每个表中。我认为这是最简单的,但感觉真的多余。

  • 创建一个名为“boolean_options”的额外表格,该表格属于公司和公司。每个布尔值都添加到此表中,然后连接到相应的模型。

  • 使用has_many_booleans gem之类的东西,这意味着我在每个表中添加一列(布尔值)并处理代码中的数据。这似乎是最不明显的解决方案,但对我来说感觉更优雅,特别是在需要为这些表添加更多布尔值的时候。

处理多个表中出现的布尔值的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

答案可能更多地取决于您的整体概念而不是其他任何东西。对于每个真/假的数据位,问问自己它与模型的本质有多紧密联系。每个位在模型实例中引用或在搜索中使用的频率。那些紧密相连的可能属于模型;较少的那些可以更好地分组在其他表中。

示例:在现实世界中,公司是一种公司,并且共享许多Company属性;这些属性可以存储在Company表中,可能带有is_a_corporation标记。

如果公司具有独特的属性,例如拥有公司的能力,那么这些功能和属性应该在Corporation模型中。

Booleans as Bits:我不认为在模型中有很多布尔属性有什么问题,但我同意在表格中包含所有这些布尔列似乎不太优雅。我查看了has_many_booleans gem,它为模拟按位操作和掩码提供了一些有趣的机会,这些操作来自嵌入式软件世界,对我来说很有意义。

检查周围,我发现 Postgresql (我选择的数据库)提供了 bitstring 数据类型,并提供了大量的实际按位操作尽可能多的比特,只使用一列你的所有布尔值,这对我来说似乎非常酷。缺点是您必须配置列并在本机SQL中执行操作。