2011-09-01 48 views
2

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

+1

40布尔风格是一个糟糕的设计。请阅读数据库规范化。当你必须添加一个新的风格时会发生什么?模式改变!不是一个好计划。 – RedFilter

+0

如果通过数据规范化你的意思是关系数据库,我不认为这就是我想要的:/ 假设一个人搜索一个具有拉丁和雷鬼音乐的事件,并且一个事件同时存在,那么同一事件列表中两次返回列表中?从我读过的和问过的,是的。 – pufAmuf

+0

'NO' ...使用'GROUP BY' – ajreal

回答

3

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

您应该设计数据库模式,以便它足够灵活,以便随时间推移应用程序内容。例如,您可以为每个音乐风格设置一行主表,定义其ID和名称,说明等。然后,包含实体(如果我正确理解您的问题,则为事件)和来自主表的音乐风格。通过放置外键来保证数据的一致性,确保数据始终清洁(例如,您不能引用不在主表中的音乐风格)。这样,您可以修改音乐风格而不用触摸数据库结构中的任何内容。

读一下database normalization会帮助你很多;您不必一路走到完全规范化的数据库,但了解背后的原则将允许您设计高效且清晰的数据库结构。

+0

虽然这种方法无法动态地添加新的音乐风格*,但运行“ALTER”脚本几乎没有痛苦或容易出错......一个更大的痛点非常规的表格难以编写基于连接的请求。 –

+0

好吧,我会重新读一切。然而,是否有可能搜索 - 比如说90年代+爵士乐。在这种情况下,一个事件会具有这两种音乐风格。这可能会返回两行,但是可以让显示给用户的“表格列表”只显示一次特定的事件,而在一列中显示90s +爵士乐? 编辑:我现在seee:“Group by” – pufAmuf

+0

@pufAmuf:当然可以,例如使用GROUP BY子句或GROUP_CONCAT(http://dev.mysql.com/doc/refman/5.0/en/group-by- functions.html#function_group-concat),它将返回所有行中列的值,并以逗号分隔。 –

1

的可能的答案是没有

有一排不应该显著下跌DB的性能减慢多个布尔列;假设您的指数设置得当。

编辑:话虽这么说,这可能是最佳的一个细节表和JOIN分配给它来获得此数据...但你说你不想这样做。

我假设你想要做这样的事情有一个事件行与一群像“isCountry”,“isMetal”,“isPunk”栏,你会查询所有的事件标记为

isPunk = 1 OR isMetal = 1 

或类似的东西。

这种设计的弱点在于要添加/删除音乐风格,您需要更改数据库模式。
另一种方法是一个TBLMusicalStylesIDName,然后TBLEventStyles这将只包含EventIDStyleID

然后,你可以加入他们的行列,只是搜索的样式表...添加和移除风格会比较简单。

+0

感谢马修,我会继续尝试:) – pufAmuf

1

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

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

但是,所有涉及音乐风格的其他请求都会显着变慢,而且写起来也更困难。例如,“获取与当前行共享至少一种样式的所有行”对于编写执行将是一个更加困难的要求。