- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个涉及Java和MySQL的设计题。
客户端需要添加 14 个 boolean 标志 (T/F) 来跟踪现有类/表中的一些新信息。
我可以将这些标志添加到现有表中,或者我可以仅为该数据创建一个新类和表。将 14 个 boolean 标志添加到现有表中会赋予它相当多的属性,我倾向于避免这种情况(尤其是标志数量随时间增加时)。创建一个新的类/表更简洁,但在这种情况下真的有必要吗?
或者,我可以使用带掩码的 16 位整数来多路复用数据,然后我只向现有类/表添加一个变量。
我的主要问题是:在 MySQL 数据库中存储 14 个单独的 boolean 变量并将它们加载到类中是否更有效,还是存储单个整数然后(在 Java 中)使用多路复用标志会更好位操作(即掩码)?
第二个问题,如果单个标志更有效,那么在一个表中包含很多属性还是拆分它们更好?在已经有相当多实体的表中存储大量 boolean 标志的惩罚是什么?
如果主要问题的答案是“整数 + 多路复用”,那么第二个问题就没有实际意义了。
谢谢。
-R
最佳答案
我个人喜欢有单独的栏目。我可能考虑屏蔽的唯一地方是当数据库和应用程序在极端条件下或在内存或空间的任何使用都至关重要的低内存和存储设备上运行时。
除非类/表可以增长到巨大的容量,否则不应考虑 1- 空间。 要模拟 boolean 标志,一个微小的 int (1) 就足够了,您只需要 0/1 值。
2- 对于任何想要在表上进行查询或想要使用它编写报告的人来说都变得更加困难。如果您的客户端确实访问了数据库,我敢肯定在大多数情况下屏蔽是 Not Acceptable 。
3- 如果可能的话(基于数据库),在需要时在此列上建立索引会困难得多
4- 工作更多,编写更多代码应该不是问题。你现在工作得更多,但将来你会工作得更少。认为程序员/dba 的工作更少只是恕我直言的错觉。这里有一些注意事项:
a- 维护代码和编写数据库查询将更加困难。也许您现在用 Java 代码做所有事情,但您永远不知道 future 会怎样。
b- 使结构变化变得更加困难。如果客户要求删除两个标志并添加 4 个怎么办?您是否保留数据库中保留已删除标志的原始两位并添加 4 位?或者您将它们用于两个新标志,然后再添加两个位?这将如何影响已经编写的代码?跟踪所有位置并实际更改代码有多容易?
在小型应用中,这不是什么大问题。但应用程序随着时间的推移而增长。如果 table 被广泛使用,这是非常危险的。如果您的代码使用第 7 位和第 8 位标志,并且它们被删除并且决定(让其他程序员说)重用相同的地方,那么用于访问第 7 位和第 8 位的任何代码将继续运行(错误地) 直到注意到这一点。在发现并解决问题之前,它可能已经做了有害的事情。如果您有单独的列并删除了它们,则在第一次使用该代码时错误会弹出到表面,因为列将不存在。
c- 毫无疑问,为 dba 编写升级数据和/或更改结构的脚本会更加困难。有经验的 dba 不会坐下来一个接一个地写列名称,而是会使用其工具来生成脚本。通过位操作,他将不得不手工工作并且在他在各种选择/更新中产生的表达式中不会出错
5- 以上都是数据库相关的。一旦它到达您的应用程序,您就自由了。 您可以从数据库中读取 16 个标志并生成您的整数,从现在开始,您的代码可以对其进行位操作,并且可以节省时间(通过编写一次处理它的函数并使用它们)。我个人认为这里也最好不要这样做,但无论如何这是你的选择。
我知道我没有专注,我可能会在这里和那里重复。但我也希望我能够帮助您了解更长期的考虑因素,从而帮助您针对您的情况做出正确的选择。
关于java - Java 和 MySQL 中多个 boolean 标志与多路复用整数(位)的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420563/
我里面有 VC 和一个 collectionView。所有管理 Collection View 的代码我都放在那个 VC 的扩展中。但现在我需要在另一个不同的 VC 中使用这个 Collection
我很难重新使用子机图。 我需要重新使用我已链接到一个状态的状态机作为子机,在另一个状态中作为子机。但是当我给出对它的引用时,我得到一个空指针异常。 引用图片 我已经添加了对 GeneralTopup
我想尝试 lambda 的一些功能,并想编写一个 ArrayList 过滤器,并使用 IntStream 的方法来计算 ArrayList 中数字的平均值和最大值 我的第一个想法是过滤 ArrayLi
我正在开发一个 NodeJS 应用程序并使用 Mocha 进行单元测试。 假设我有两个非常相似的测试服。事实上,这些是针对两个类的测试实现相同的接口(interface)。 例如: suit_a.js
我正在使用 Glade 编写带有对话框的 python GUI。 如果我不使用 Glade,我会使用一个类来创建一个对话窗口 (dialag),运行它 (dialog.run),执行它所做的任何事情,
我在使用自定义单元格创建 UICollectionView 以显示项目时遇到问题。但是在 UICollectionView 刷新后,可重用的单元格填充了错误的索引 刷新前的 UICollectionV
我从 Sencha 学习 ExtJS 并有下一个简单的任务: 我的页面上有 2 个 div 在第一个 div 中我渲染 Ext.Button 在按钮上单击我想将其移动到另一个 div 仅此而已 我写了
我想在不同的 Node 模块中重用 RabbitMQ channel 。由于 channel 是异步创建的,我不确定将此 channel 对象“注入(inject)”到其他模块的最佳方法是什么。 如果
所以我的问题是我收到一个 SIGABRT 错误,其定义如下: *** Terminating app due to uncaught exception 'NSInvalidArgumentExcep
我正在编写一个 PHP 脚本来将主题从旧论坛站点迁移到新站点。 旧论坛站点使用数据库“old_forums” 新论坛站点使用数据库“new_forums” MySQL 用户“forums”拥有两个数据
我有一个使用 jcodec 生成的 MP4 文件。 然后我就有了一个使用 Android 的 MediaCodec 生成的 AAC 文件。 我想将它们混合到一个文件中,并且由于我不想将我的 Andro
我正在使用 ffmpeg 开发一个 c++ 项目。我必须生成一个带有 h264 编码的 mp4 文件。 我的问题是文件生成但是当用 VLC 读取文件时我没有图像,并用 ffprobe 分析它给我(下面
我将尝试重新提出这个问题。 我想要做的是创建一个新的 mp4 文件,其中将包括一个视频文件、两个音频文件和一个字幕文件。我想创建一个可以在我的 iOS 设备和计算机上播放的 mp4 文件。 文件如下:
虽然我的问题可能看起来很抽象,但我希望不是。假设我开发了一个应用程序,一个 ASP.NET MVC 站点,然后我的任务是为这个应用程序构建一个 Winforms 客户端,我可以从现有应用程序中重用多少
我是一名优秀的程序员,十分优秀!