我正在构建一个移动应用程序,我使用 PHP 和 MySQL 编写后端 - REST API。
如果我必须在我的移动应用程序中名为“报告”的表中存储大约 50-60 个 bool 值(用户必须检查表单中的内容),我将值 (0/1) 存储在一个简单的数组中。在我的 MySql 表中,我应该为每个 bool 值创建一个不同的列,还是仅使用字符串或 Int 将其存储为“数字”(如“110101110110111...”)就足够了吗?
我使用 JSON 获取和放置数据。
更新 1:我所要做的就是检查所有内容是否为 1,如果其中一个为 0,那么这就是一个“问题”。在 2 年内,这个表将有大约 15.000-20.000 行,它必须非常快并且尽可能节省空间。
更新 2:就速度而言,哪种解决方案更快?制作单独的列与将其存储在字符串/二进制类型中。如果我必须检查哪些是 0 怎么办?如果我将它作为“数字”存储在一列中并且如果它不是“111..111”然后将它作为 JSON 发送到移动应用程序,我在其中解析值并在用户的设备上分析它,这是一个很好的解决方案吗?假设我必须处理 50K 行。
提前致谢。
最佳答案
在搜索时,每个值单独列更灵活。
如果不同的行有不同的 bool 值集合,单独的键/值表会更灵活。
如果
- 您的 bool 值列表或多或少是静态的
- 您的所有行都包含所有这些 bool 值
- 您的性能关键搜索是查找其中任何值为假的行
然后使用诸如“1001010010”等文本字符串是存储它们的好方法。你可以这样搜索
WHERE flags <> '11111111'
找到您需要的行。
您可以使用一个 BINARY 列,每个标志位一个位。但是,如果您使用文本,您的表格将更容易用于临时查询和眼球检查。在您开始存储数百万行之前,使用 BINARY 而不是 CHAR 节省的空间不会很大。
edit 不得不说:每次我用 bool 属性数组构建类似的东西时,我后来都对它变得多么不灵活感到失望。例如,假设它是一个灯泡目录。在千禧年之交, bool 标志可能是
screw base
halogen
mercury vapor
low voltage
然后,事情发生了变化,我发现自己需要更多的 bool 标志,比如,
LED
CFL
dimmable
Energy Star
等等。突然之间,我的数据类型不够大,无法容纳我需要它们容纳的东西。当我写“你的 bool 值列表或多或少是静态的”时,我的意思是你不合理地期望在你的应用程序的生命周期内有像灯泡特性这样的变化。
因此,单独的属性表可能是更好的解决方案。它会有这些列:
item_id fk to item table -- pk
attribute_id attribute identifier -- pk
attribute_value
这最终是灵活的。您可以添加新标志。您可以在应用程序的生命周期中随时将它们添加到现有项目或新项目。而且,每个项目都不需要相同的标志集合。你可以写“哪些元素有任何虚假属性?”像这样查询:
SELECT DISTINCT item_id FROM attribute_table WHERE attribute_value = 0
但是,您必须小心,因为“哪些项目缺少属性”的查询很难编写。
关于php - 如何在 MySQL 数据库中存储 60 个 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35394867/