我对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 | |
+---------------+--------------+------+-----+-------------------+-------+
但我确定这不是一个好的布局。你们有关于表/数据库结构应该是什么样子的建议吗?
答案 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足够且效率更高。通常,整数类型对于搜索操作来说效率更高。