由于40个布尔列导致相当大的减速?

时间:2011-09-01 15:14:51

标签: mysql normalization

我正在尝试将音乐风格列添加到事件表中,并且根据我收集的内容,可以通过为每种音乐风格添加列或通过执行多对多表关系来完成不想要因为我希望每个事件只在表格中返回一次。你认为连续有多个布尔列,我会面临相当大的数据库减速吗? (数据只能由用户读取)。 谢谢:))

3 个答案:

答案 0 :(得分:3)

列不会减慢数据库本身的速度,但请记住,为每种音乐风格添加布尔列都是非常糟糕的设计。随着时间的推移,应用程序中可能的音乐风格可能会发生变化:可能必须添加新的音乐风格,必须删除冗余或无用的音乐风格等等。使用您提出的设计,您必须修改数据库结构以将新列添加到表中。这通常是痛苦的,容易出错,而且您还必须检查所有查询以确保它们不会因新结构而中断。

您应该设计数据库架构,使其足够灵活,以允许应用程序内容随时间变化。例如,您可以拥有一个主表,每个音乐风格都有一行,定义其ID及其名称,描述等。然后,包含实体之间关系的关系表(事件,如果我正确理解您的问题)和主表中的音乐风格。您可以通过放置外键来强制执行一致性,以确保数据始终是干净的(例如,您无法引用不在主表中的音乐风格)。这样,您可以修改音乐风格,而无需触及数据库结构中的任何内容。

database normalization上读一下会对你有所帮助;您不必一直拥有完全规范化的数据库,但了解其背后的原理将允许您设计高效且干净的数据库结构。

答案 1 :(得分:1)

可能的答案是

一行中有多个布尔列不应该显着降低数据库性能;假设您的指数设置得恰当。

编辑:据说最好为其分配详细信息表格JOIN以获取此数据...但是您说您不想这样做。

我假设您想要做一些像“isCountry”,“isMetal”,“isPunk”等一系列列的事件行,并且您将查询标记为

的所有事件
isPunk = 1 OR isMetal = 1

或类似的东西。

此设计的缺点是添加/删除您需要更改数据库架构的音乐风格。
替代方案是TBLMusicalStyles IDName,然后是TBLEventStyles,其中只包含EventIDStyleID

然后你可以加入他们,只需搜索样式表......添加和删除样式会相对简单。

答案 2 :(得分:1)

不涉及音乐风格的请求的表现不会受到影响。

如果你的列被正确编入索引,那么涉及查找与客户提供的音乐风格匹配的行的请求实际上应该更快

然而,涉及音乐风格的所有其他请求将显着变慢,并且更难写。例如,“获取与当前行共享至少一个样式的所有行”将是一个更难写的执行的请求。