在MySQL中,通常更快/更有效/可扩展,返回100行3列,或1行100列?

换句话说,当存储多个key =>与记录相关的值对,最好存储每个键=>一个单独的行中的值对与record_id作为键,或者每个record_id有一行,每个键有一列?

此外,还假设需要相当频繁地添加/删除密钥,我认为一旦表格变得足够大,就会影响许多列方法的长期可维护性。

编辑:以“定期”方式澄清我的意思是每月左右添加或删除一次密钥。

有帮助吗?

解决方案

您不应该定期添加或删除列。

其他提示

http://en.wikipedia.org/wiki/Entity-Attribute-Value_model

关于这个模型有很多不好的事情,如果还有其他选择,我就不会使用它。如果您不了解应用程序所需的大部分数据列(除少数用户可自定义字段之外),那么您需要花费更多时间进行设计并弄清楚。

如果您的密钥已预设(在设计时已知),则是,您应将每个密钥放入单独的列中。

如果在设计时不知道它们,则必须将数据作为键值对列表返回,稍后您应该在 RDBMS 之外进行解析。

如果要存储键/值对,则应该有一个包含两列的表,一列用于键(将其设为表的PK),另一列用于值(可能根本不需要这个列) 。请记住,“密钥,整个密钥,只有密钥。”

在多列方法中,您会发现表的增长没有限制,因为删除列将会破坏所有值并且您不希望这样做。我从这里的经验谈到了一个遗留系统,它有一个表有近1000列的表,其中大部分都是位字段。最后,你停止能够删除任何列,因为某人可能正在使用它,而你上次这样做时,你已经工作到凌晨2点回滚到备份。

首先:确定您的数据需要访问的频率。如果始终需要一次性检索数据并且大部分数据都被使用,则考虑将所有密钥对存储为序列化值或xml值。如果您需要对该数据进行任何类型的复杂分析,并且您需要值对,那么列可以,但将它们限制为您知道执行查询所需的值。它通常更容易设计对一个参数使用一列而不是行的查询。您还会发现它更容易使用 返回值如果它们都在一行中而不是多行。

第二步:将最常访问的数据分开并将其放在自己的表中,将其他数据放在另一个表中。顺便说一下,100列很多,所以我建议您将数据拆分成更易于管理的小块。

最后:如果您有经常更改的数据,则应在一个表中使用创建列(键),然后使用其存储键值的数字键值。这假设您将多次使用相同的密钥,并且在您进行查找时应加快搜索速度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top