我需要一个好的MySQL数据库结构

时间:2012-09-13 22:13:42

标签: mysql database layout structure

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

riddim(rythm)可以容纳几首曲子(歌曲)。歌曲包含以下信息/字段:姓名,艺术家,标签,制作人,上次修改时间戳,年份,歌词,旗帜,标签,来源。

riddim有字段名称,最后修改,流派,youtube和图像。

以下是更好理解的说明: http://img194.imageshack.us/img194/6553/93112345.png

如果我将所有信息都放在一个表格中,我将会有冗余数据(例如流派或图像),因为每一行都有艺术家/曲调会有一个在其中演唱的riddim(rythm)。

目前我的表格如下:

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 |       |
+---------------+--------------+------+-----+-------------------+-------+

TUNES表:

+---------------+--------------+------+-----+-------------------+-------+
| 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 |       |
+---------------+--------------+------+-----+-------------------+-------+

但我确定这不是一个好的布局。你们有关于表/数据库结构应该是什么样子的建议吗?

3 个答案:

答案 0 :(得分:1)

在单独的表格中使用'riddems'和'tunes'是正确的结构。基本上将数据建模为信号对象,如果某些字段实际上属于两个不同的对象,则应该在两个不同的表中。

要将太多表连接在一起,在属于父表的表上(在这种情况下,一个riddem有很多曲调,所以曲调属于riddem)对父类id字段进行引用。所以在这种情况下,曲调表应该有一个名为'riddem_id'的字段,该字段设置为曲调所属的尾部。

答案 1 :(得分:1)

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

如果您使用此结构,则不需要(实际上不应该)复制任何数据。要查找有关曲调所在的riddim的信息,请在选择查询中执行join

答案 2 :(得分:0)

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

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

如果确实如此,你必须在riddim表中使用riddim字段作为指向tunes表中主要riddim字段的外键。你可以有多个riddim记录引用一个曲调记录。

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

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

我不确定为什么你在年份字段中使用VARCHAR类型。对于搜索和存储来说,.MALLINT足够且效率更高。通常,整数类型对于搜索操作来说效率更高。