我正在创建一个音乐播放器,用户可以在其中搜索艺术家,专辑或歌曲。
我创建了一个脚本,可以读取音乐库中mp3的所有标签,并在单个表格中更新歌曲数据库,其中包含艺术家姓名,专辑,曲目标题等。 目前,这很有效,因为它可以扫描音乐库中的任何更改,并添加/删除数据库中相应歌曲的行。 因此,这个扫描例程是一个相当简短易懂的代码段,因为它只维护一个表。
我理解,如果艺术家,专辑和曲目都有自己的表格,并且所有表格都相互链接,那么数据库会更强大。我还没有对搜索部分做过任何事情 - 如果我把所有东西放在一张桌子里,我怎么搞砸了?
感谢。
答案 0 :(得分:2)
您的数据库未规范化。你说它只在一个表中,但你没有提供任何关于模式的信息。
非规范化数据库存在的问题类型包括与存储冗余信息相关的一致性问题 - 如果您有类似的话:
专辑,曲目,艺术家
然后要更改相册名称,您必须在与相册关联的每个轨道上更改它。
当然,有各种各样的“数据库”系统都没有规范化,但这些系统通常都有处理适合其范例的这类事物的机制。
答案 1 :(得分:2)
关于Pink / P!nk的情况,如果这对你来说很重要,那么,规范化会很有用。
您的歌曲表会引用artist_id。
你还有一个艺术家别名表,可以将特定艺术家所经过的各种名称映射到该artist_id。
但是这可能变得相当复杂,从技术上讲,在你的情况下甚至可能都不正确,就像艺术家选择以不同的名字发布项目一样,他们可能不希望将它们全部集中在一起。
一般来说,规范化数据库是一个安全的起点,但是有很多很好的理由去反规范化,更重要的是要理解这些原因,然后盲目地总是以某种方式做事。
答案 2 :(得分:1)
如果您从未听说过规范化或理解其重要性,也许您应该阅读this。这是一个简洁,简单的解释,没有太多行话。
或者您可以直接访问源代码,因为您已经在使用mysql:
http://dev.mysql.com/tech-resources/articles/intro-to-normalization.html
考虑模型中的基数和关系:
您需要仔细考虑索引,主键和外键。将索引添加到您要搜索的非键列或组。
这个设计将有四个表:专辑,曲目,艺术家和artist_to_album多对多连接表。
答案 3 :(得分:0)
因此,您所询问的主题称为“规范化”,虽然这在许多情况下都很有用,但并不总是适用。
考虑艺术家Pink。她的一些专辑的名称为Pink
,其他P!nk
我们认为它们在视觉上是相同的,因为我们知道这是她的。但是数据库会强制分别看到这两个(这也使得搜索她的歌更难,但这是另一个故事)。还可以考虑普林斯,“艺术家正式称为王子”等。
因此,有可能让艺术家ID
与Pink
和P!nk
匹配,但也与她的相册Funhouse
等相匹配。(我是现在真的要停止使用这些例子,因为任何更多的例子都需要以表格形式表示。)
所以,我认为问题在于,您希望您的搜索有多复杂?按原样,您可以在标记和数据库信息之间保持1:1的相关性。这取决于你想要的东西是多么的花哨。另外,对于我上面提到的查找,考虑到大多数时候信息来自用户,你实际上不能提供从P!nk到Pink的查找,而不是从Elephant到Pachyderm,因为你不知道人们想要进入什么地方。
我认为在这种情况下,天真的方法也是如此。