Столбец базы данных MySQL, имеющий несколько значений - PullRequest
9 голосов
/ 12 апреля 2011

У меня был вопрос о том, легко ли работать с моей идеей реализации с запросами / записью запросов.

В настоящее время у меня есть база данных с несколькими столбцами. Большинство столбцов - это одно и то же (элементы, но разделенные на элемент 1, элемент 2, элемент 3 и т. Д.).

Итак, в настоящее время в моей базе данных есть ID, Имя, Элемент 1, Элемент 2 ..... Элемент 10.

Я хочу сжать это в ID, Имя, Предмет.

Но я хочу, чтобы элемент имел несколько значений в разных строках. То есть

ID = One  Name = Hello   Item = This
                              That
                              There

Вроде как формат выглядит. Это хорошая идея, и как именно я это сделаю? Я не буду использовать номера в базе данных, и вся информация будет статичной и никогда не изменится.

Могу ли я сделать это, используя 1 таблицу базы данных (и будет ли легко сопоставить элементы одного идентификатора с другим идентификатором), или мне нужно будет создать 2 таблицы и связать их?

Если так, как именно я бы создал 2 таблицы и сделал их реляционными?

Есть идеи, как это реализовать? Спасибо!

Ответы [ 3 ]

6 голосов
/ 12 апреля 2011

Это классический тип денормализованной базы данных.Денормализация иногда делает определенные операции более эффективными, но чаще приводит к неэффективности.(Например, если один из ваших запросов на запись должен был изменить имя, связанное с идентификатором, вам придется изменить много строк вместо одной.) Денормализация должна выполняться только по определенным причинам после aразработана полностью нормализованная база данных.В вашем примере нормализованный дизайн базы данных будет выглядеть следующим образом:

table_1: ID (ключ), Name
table_2: ID (внешний ключ сопоставлен с table_1.ID), Item

4 голосов
/ 12 апреля 2011

Вы говорите о денормализованной таблице, с которой базам данных 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 на поле artist_id, которое является внешним ключом для Artist_id таблицы Artist.

Конечно, в действительности песни, альбомы и исполнители являются более сложными. Одна песня может быть в нескольких альбомах, несколько исполнителей могут быть в одном альбоме, есть несколько версий одной и той же песни, и есть даже некоторые песни, у которых альбом вообще не выпущен.

Пример:

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

2 голосов
/ 12 апреля 2011

Я не думаю, что одна таблица действительно имеет смысл в этом случае. Вместо этого вы можете сделать:

Main Table:
ID
Name

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

Тогда, когда вы делаете запросы, вы можете сделать простое объединение

...