在MySQL中,通常更快/更有效/可扩展,返回100行3列,或1行100列?
换句话说,当存储多个key =>与记录相关的值对,最好存储每个键=>一个单独的行中的值对与record_id作为键,或者每个record_id有一行,每个键都有一列?
此外,还假设需要相当频繁地添加/删除密钥,我认为一旦表格变得足够大,这将影响许多列方法的长期可维护性。
编辑:通过“定期”澄清,我的意思是每月左右添加或删除一次密钥。
答案 0 :(得分:10)
您不应该定期添加或删除列。
答案 1 :(得分:2)
http://en.wikipedia.org/wiki/Entity-Attribute-Value_model
关于这个模型有很多不好的事情,如果还有其他选择,我就不会使用它。如果您不了解应用程序所需的数据列的大多数(除少数用户可自定义字段除外),那么您需要花费更多时间进行设计并弄清楚。
答案 2 :(得分:1)
如果您的密钥是预设的(在设计时已知),那么您应该将每个密钥放在一个单独的列中。
如果在设计时间内不知道它们,那么您必须将数据作为键值对列表返回,以后应该在RDBMS
之外解析。
答案 3 :(得分:1)
如果要存储键/值对,则应该有一个包含两列的表,一列用于键(将其设为表的PK),另一列用于值(可能根本不需要索引) 。记住,“钥匙,整个钥匙,除钥匙外什么都没有。”
在多列方法中,您会发现表的增长没有限制,因为删除列将会破坏所有值并且您不希望这样做。我从这里的经验谈到了一个遗留系统,它有一个表有近1000列的表,其中大部分都是位字段。最后,你停止能够删除任何列,因为某人可能正在使用它,而你上次这样做时,你已经工作到凌晨2点回滚到备份。
答案 4 :(得分:0)
首先:确定您的数据需要访问的频率。如果始终需要一次性检索数据并且大部分数据都被使用,则考虑将所有密钥对存储为序列化值或xml值。如果您需要对该数据进行任何类型的复杂分析,并且您需要值对,那么列可以,但将它们限制为您知道执行查询所需的值。设计对一个参数使用一列而不是行的查询通常更容易。您还会发现它更容易使用 返回值如果它们都在一行中而不是多行。
第二步:将最常访问的数据分开并将其放在自己的表中,将其他数据放在另一个表中。顺便说一下,100列很多,所以我建议您将数据拆分成更易于管理的小块。
最后:如果您有经常更改的数据,则应在一个表中使用创建列(键),然后使用其存储键值的数字键值。这假设您将多次使用相同的密钥,并且在您进行查找时应加快搜索速度。