1

这是一个涉及 Java 和 MySQL 的设计问题。

客户端需要添加 14 个布尔标志 (T/F) 来跟踪现有类/表中的一些新信息。

我可以将这些标志添加到现有表中,或者我可以为这些数据创建一个新的类和表。将 14 个布尔标志添加到现有表将为其提供相当多的属性,我倾向于避免这些属性(特别是如果标志的数量随时间增加)。创建一个新的类/表更干净,但在这种情况下真的有必要吗?

或者,我可以使用带掩码的 16 位整数来多路复用数据,然后我只将一个变量添加到现有的类/表中。

我的主要问题是:在 MySQL 数据库中存储 14 个单独的布尔变量并将它们加载到类中是否更有效,或者存储单个整数然后(在 Java 中)使用位操作多路复用标志会更好(即面具)?

第二个问题,如果单个标志更有效,那么在一张表中有很多属性还是拆分它们更好?在已经有很多实体的表中存储大量布尔标志的惩罚是什么?

如果主要问题的答案是“整数 + 多路复用”,那么第二个问题就没有实际意义了。

谢谢。

-R

4

4 回答 4

3

我个人喜欢有单独的列。我可能会考虑屏蔽的唯一地方是当数据库和应用程序在极端条件下或在内存或空间使用至关重要的低内存和存储设备上运行时。

1-除非类/表可以增长到巨大的容量,否则不应考虑空间。要模拟布尔标志,一个很小的 ​​int (1) 就足够了,您所需要的只是 0/1 值。

2-对于任何想要在表格上进行查询或想要使用它编写报告的人来说变得更加困难。如果您的客户确实访问了数据库,我很确定在大多数情况下屏蔽是不可接受的。

3-如果可能的话,在需要时在此列上建立索引将更加困难(基于数据库)

4-工作更多和编写更多代码应该不是问题。你现在工作得更多,但将来你工作得更少。认为程序员/ dba的工作量减少只是恕我直言的错觉。以下是一些注意事项:

a- 维护代码和编写数据库查询将更加困难。也许你现在用你的 java 代码做所有事情,但你永远不知道未来会怎样。

b- 使结构变化变得更加困难。如果客户要求移除两个标志并添加 4 怎么办?您是否保留数据库中保留已删除标志的原始两位并添加 4 位?或者您将它们用于两个新标志,然后再添加两个位?这将如何影响已经编写的代码?跟踪所有位置并实际更改代码有多容易?

在小型应用程序中,这不是什么大问题。但应用程序会随着时间的推移而增长。如果桌子被广泛使用,这是非常危险的。如果您的代码使用第 7 位和第 8 位标志,并且它们被删除并且决定(由其他一些程序员说)重用相同的位置,则用于访问第 7 位和第 8 位的任何代码都将继续运行(不正确) 直到被注意到。在发现并解决问题之前,它可能已经做了有害的事情。如果您有单独的列并且您删除了它们,则错误将在第一次使用该代码时弹出表面,因为列将不存在。

c- 毫无疑问,为 dba 制作升级数据和/或更改结构的脚本会更加困难。有经验的 dba 不会坐下来一个接一个地编写列名,而是使用其工具生成脚本。通过位操作,他将不得不手工工作,并且在他在各种选择/更新中产生的表达式中不会出错

5-以上都是数据库相关的。一旦它到达您的应用程序,您就自由了。您可以从数据库中读取 16 个标志并生成整数,从现在开始,您的代码可以对其使用位操作,并且可以节省时间(通过编写处理一次并使用它们的函数)。我个人认为这里也最好不要这样做,但无论如何这是你的选择。

我知道我没有专注,我可能会在这里和那里重复。但我也希望我能够帮助您了解更长期的考虑,帮助您为您的案例做出正确的选择。

于 2011-12-07T21:17:50.550 回答
1

您可以使用EnumSet。这是模拟标志的最佳方式 - 设计更加清晰,并且具有与 int 几乎相同的性能。可以很容易地转换为 int(读取/放入数据库)。有关更多信息,请参阅“Effective Java”一书,“EnumSet”一章

于 2011-12-07T18:37:36.813 回答
1

看看SET Column Type

于 2011-12-07T18:34:12.650 回答
0

在主要问题中,您问什么更有效,然后什么更好。这使答案复杂化。

从开发人员和 DBA 的角度来看,拥有一个列是更有效的解决方案。因为您节省空间并使用掩码,您可以提高插入和更新的性能。

从数据分析师的角度来看,单独的列是更有效的解决方案,每列都有指定的角色。

正如我所说,我更喜欢掩码 - 代码中的变化 - 更好的管理(有限的整数容量在这里是一个风险)

于 2011-12-07T18:42:21.317 回答