MySQL数据库列具有多个值

Posted

技术标签:

【中文标题】MySQL数据库列具有多个值【英文标题】:MySQL Database column having multiple values 【发布时间】:2011-08-03 13:09:39 【问题描述】:

我有一个关于我的实现想法是否易于使用/编写查询的问题。

我目前有一个包含多列的数据库。大多数列都是相同的(项目,但分为项目 1、项目 2、项目 3 等)。

所以我目前在我的数据库中有 ID、名称、项目 1、项目 2 ..... 项目 10。

我想把它浓缩成ID、Name、Item。

但我想要 item 将多个值存储为不同的行。 IE。

ID = One  Name = Hello   Item = This
                              That
                              There

有点像它看起来的格式。这是一个好主意,我将如何去做呢?我将在数据库中不使用任何数字,所有信息都是静态的,永远不会改变。

我可以使用 1 个数据库表来执行此操作(将一个 ID 的项目与另一个 ID 匹配是否容易),还是需要创建 2 个表并将它们链接?

如果是这样,我将如何创建 2 个表并使它们相互关联?

关于如何实现这一点的任何想法?谢谢!

【问题讨论】:

我认为您的问题可能过于具体。您要实现的更广泛的目标是什么? 下面的答案非常清楚 - 你所拥有的是关于为什么数据库将数据存储在多个表中,按数字(也称为“键”)交叉引用行的经典案例。 【参考方案1】:

这是一种经典类型的非规范化数据库。非规范化有时会使某些操作更有效率,但更多时候会导致效率低下。 (例如,如果您的写入查询之一是更改与 id 关联的名称,则您将不得不更改许多行而不是单个行。)非规范化仅应出于特定原因进行之后设计了一个完全标准化的数据库。在您的示例中,规范化的数据库设计将是:

table_1:ID(键)、名称 table_2:ID(外键映射到table_1.ID),Item

【讨论】:

【参考方案2】:

您说的是非规范化表,SQL 数据库很难处理。据说您的 Item 字段与其他字段具有多对一的关系。正确的做法是制作两张桌子。典型的例子是专辑和歌曲。歌曲与专辑具有多对一的关系,因此您可以像这样构建您的能力:

Table Album
album_id [Primary Key]
Title
Artist

Table Song
song_id [Primary Key]
album_id [Foreign Key album.album_id]
Title

此示例通常使用第三个表 Artist,您可以用 Artist_id 字段替换 Artist_id 字段,该字段是 Artist 表的 Artist_id 的外键。

当然,实际上歌曲、专辑和艺术家更复杂。一首歌可以在多张专辑中,多位艺术家可以在一张专辑中,同一首歌有多个版本,甚至有些歌曲根本没有专辑发行。

例子:

Album
album_id Title       Artist
1        White       Beatles
2        Black       Metallica

Song
song_id  album_id  Title
1        2         Enter Sandman
2        1         Back in the Us-s-r
3        2         Sad but True
4        2         Nothing Else Matters
5        1         Helter Skelter

要查询这个,你只需做一个 JOIN: SELECT * FROM Album INNER JOIN Song ON Album.album_id = Song.album_id

【讨论】:

【参考方案3】:

我认为在这种情况下,一张桌子真的没有意义。相反,您可以这样做:

Main Table:
ID
Name

Item Table:
ID
Item #
Item Value
Main_ID = Main Table.ID

然后,当您进行查询时,您可以进行简单的联接

【讨论】:

以上是关于MySQL数据库列具有多个值的主要内容,如果未能解决你的问题,请参考以下文章

带有逗号分隔值的 Codeigniter Mysql 列

Mysql设计索引的原则

MYSQL - 1列中的多个所有数据在同一列中具有最大值

在MySQL数据库中使用多个WHERE子句值更新多个列值时出现错误。

如何将具有自动递增值的列添加到 mySql 数据库的表中?

MySQL:将连接后的多个值组合到一个结果列中