提问人:Pekka 提问时间:10/26/2009 更新时间:7/24/2011 访问量:957
对mySQL表中大量列的专家意见?
Expert opinions on a very large number of columns in a mySQL table?
问:
我正在创建一个工具,用于在CMS中编辑网页。 该工具的主要目标是为用户提供完全的灵活性。因此,可以在其中编辑大量属性 - 如下属性(片段):
langbutton_menu_border_color_left
langbutton_menu_border_width_left
langbutton_menu_border_style_left
langbutton_menu_border_color_right
...你明白了。到目前为止,我有 238 个这样的属性,主要是整数和短字符串。 我现在必须为数据创建一个 mysql 表。我有多年的 Web 开发经验,甚至考虑将 238 列放入 mySQL 表中绝对是禁忌。但转念一想,我开始想,为什么不呢?
这对我来说是目前最方便的事情,因为我正在集成这个新工具的 CMS 包含一系列与单个数据库列相连的现成输入元素。存储属性的任何其他方式(例如,将它们分组以便将“边界”属性存储在一个字段中)都需要对集合进行巨大更改,我非常想避免这种情况 - 我正在一个大项目中,并且日以继夜地工作。
我将根据 XML 定义创建和更改表,这样我就可以忍受管理 238 列表。 存储效率并不重要 - 预期的页数不会超过 50-100。 除了使用主键一次加载一个页面外,我不需要对表进行任何查询。
那么,mySQL专家们,有什么反对将这种数据存储在238列中的严肃言论吗?你会期待问题、指数级的内存使用率等吗?
通常,我会将各种属性转换为完整的 CSS 字符串,并构建可以解析和处理此类字符串的类 - 这将大大减少数量。但考虑到时间限制?
答:
这些列中有多少需要独立于其他列进行查询和更新?这些列中的任何一列是否涉及与其他表的关系,或者它们都只是数据?
我不知道您的使用计划,但在某些情况下,将所有这些数据存储为 BLOB 更有意义。如果它总是一起检索并且不参与任何查询,这就是我会做的。
评论
从理论上讲,mySQL 现在限制在一个表中的 4096 列(考虑到其他约束,即默认 NULL 值等,稍微少一点)。所以,你有相当大的利润。 就个人而言,在 Web 开发中,我尝试将 # 列保持在 50 <。我看到了有 100+ 列的表,它有效,但很难维护这样的表。 如果您不必搜索该列,请考虑在 php 数组上序列化并将值存储在 TEXT 中。它更快、更灵活。
我以前尝试过这样的方法。 很有可能没有人会在单个元素上使用所有 238 个属性。
恕我直言,您最好向用户建议可用属性。 然后,让用户通过从列表中挑选可用属性并设置其值来组合可用属性。 然后,您可以将用户输入组合到一个文本数组中,例如 [property:value,property:value],并将其粘贴到您需要设置样式的元素上的单个列中。
评论