【问题标题】:I need a good MySQL database structure我需要一个好的 MySQL 数据库结构
【发布时间】:2012-09-13 22:13:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: mysql database layout structure


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的信息,我会将其更改为 riddim_id 并添加一个“名称”字段,就像上图一样。
    【解决方案2】:

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

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

    【讨论】:

    • 继续规范化...将“艺术家”、“标签”、“制片人”等放到他们自己的表格中。
    • 你的意思是“规范化”,为每个具有外键 auto_increment id 和名称的表创建一个表?
    • 是的——虽然它被称为自己表的主键,当从另一个表引用时称为外键。
    • 好的,谢谢 :) 我会尽量坚持下去,我只是担心到那时对于初学者来说查询会很困难。
    • 如果艺术家每人只有一首曲子,那么您可以将链接字段放在艺术家表中而不是曲调表中(艺术家中的一个字段存储他们链接到的曲调的 id)。但是,如果一位艺术家可以有很多曲调,而一种曲调可以有很多艺术家,那么您应该使用链接表。因此,主表都没有外键字段,并且您有一个名为 tune_artist_link 或其他任何内容的新表,其中包含自己的 id、tune id 和艺术家 id。这样,您就可以在该表中为艺术家和曲调之间的每个连接创建一个条目。您必须在选择查询中进行两次连接...
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 老实说我对数据库完全陌生。我想riddims 是调子的父母,虽然我不太确定父母/孩子的意思是什么,说话的数据库。 'image' 有 11 个字符,因为图像保存到 /images/covers/ 并随机命名(即 19283728374.jpg)。 'youtube' 是 11 个字符,因为每个 youtube 视频的唯一标识符都是 11 个字符长。最重要的搜索字段是“riddim”、“artist”和“tune”。所以我要把这些作为索引。 "year" 是 varchar(4),因为它还可以包含格式为 "199x" 或 "198x" 的年份。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多