0

我对 MySQL 很陌生,并不真正知道如何为以下设置创建一个好的布局:

一个riddim(节奏)可以容纳几首曲调(歌曲)。一首歌具有以下信息/字段:名称、艺术家、标签、制作人、最后修改的时间戳、年份、歌词、标志、标签、来源。

riddim 具有字段名称、上次修改时间、流派、youtube 和图像。

这是一个更好理解的插图:http: //img194.imageshack.us/img194/6553/93112345.png

如果我将所有信息放在一个表中,我将有冗余数据(例如流派或图像),因为每行带有艺术家/曲调的都会有它所唱的旋律(节奏)。

目前我的表格如下所示:

RIDDIMS 表:

+---------------+--------------+------+-----+-------------------+-------+
| Field         | Type         | Null | Key | Default           | Extra |
+---------------+--------------+------+-----+-------------------+-------+
| riddim        | varchar(255) | NO   | MUL | NULL              |       |
| genre         | varchar(9)   | NO   |     | NULL              |       |
| youtube       | varchar(11)  | NO   |     | NULL              |       |
| image         | varchar(11)  | NO   |     | NULL              |       |
| last_modified | timestamp    | NO   |     | CURRENT_TIMESTAMP |       |
+---------------+--------------+------+-----+-------------------+-------+

调音表:

+---------------+--------------+------+-----+-------------------+-------+
| Field         | Type         | Null | Key | Default           | Extra |
+---------------+--------------+------+-----+-------------------+-------+
| riddim        | varchar(255) | NO   | MUL | NULL              |       |
| artist        | varchar(255) | NO   | MUL | NULL              |       |
| tune          | varchar(255) | NO   |     | NULL              |       |
| label         | varchar(255) | NO   |     | NULL              |       |
| producer      | varchar(255) | NO   |     | NULL              |       |
| year          | varchar(4)   | NO   |     | NULL              |       |
| lyrics        | text         | NO   |     | NULL              |       |
| flag          | varchar(12)  | NO   |     | NULL              |       |
| tag           | varchar(255) | NO   |     | NULL              |       |
| source        | varchar(255) | NO   |     | NULL              |       |
| last_modified | timestamp    | YES  |     | CURRENT_TIMESTAMP |       |
+---------------+--------------+------+-----+-------------------+-------+

但我敢肯定这不是一个好的布局。你们对表/数据库结构的外观有什么建议吗?

4

3 回答 3

1

将“谜语”和“曲调”放在单独的表格中是使用正确的结构。基本上将您的数据建模为符号对象,如果某些字段实际上属于两个不同的对象,它应该在两个不同的表中。

要将两个表连接在一起,请在属于父表的表上(在这种情况下,一个riddem 有很多曲调,因此曲调属于riddem)放置一个对父id 字段的引用。所以在这种情况下,tunes 表应该有一个名为“riddem_id”的字段,该字段设置为该曲调所属的riddem。

于 2012-09-13T22:18:38.753 回答
1

tunes 表的riddim 字段应该是riddims 表主键的外键。通常,除非您绝对确定它们是唯一的,否则将文本字段用作主键并不是一个好主意。更安全的选择是使用一个名为 id 或 riddim_id 的字段,它是一个带有 AUTO_INCREMENT 属性集的数字。这样,您添加的每个新项目都将自动获得自己的唯一密钥。然后将外键设置为与另一个表中链接记录的 id 具有相同的值。

如果您使用这种结构,那么您不需要(实际上也不应该)复制任何数据。要查找有关曲调所在的谜语的信息,请在选择查询中进行连接。

于 2012-09-13T22:22:20.967 回答
0

MySQL 与其他关系数据库没有太大区别。因此,如果您有使用 Oracle、DB2、PostgreSQL 的经验,您可以在您的设计中使用它。

在您的解释中,您没有提到两个表之间可能存在的父子关系。曲调表是riddim表的父级吗?

如果是真的,您必须使用riddim 表中的riddim 字段作为指向tunes 表中主要riddim 字段的外键。您可以拥有多个引用单曲记录的riddim 记录。

为什么 image 和 youtube 有 11 个字符对我来说并不明显。如果 youtune 字段包含实际 URL,则需要更多字符。您是否要使用枚举器对 youtube 和图像字段进行编码以避免长字符串?

问问自己,您的典型搜索将如何执行?最重要的搜索领域是什么?

我不确定为什么您对年份字段使用 VARCHAR 类型。SMALLINT 对于搜索和存储来说就足够了,而且效率更高。通常,整数类型对于搜索操作要高效得多。

于 2012-09-13T22:45:16.590 回答