2016-03-07 6 views
0

У меня есть таблица с именем user_thoughts. В таблице много столбцов, один из которых - favourited_by.Хранение нескольких данных в одном поле (хранение данных в массиве в базе данных)

thought может быть Добавлен в избранное многими пользователями, но я не хочу, чтобы создать новую строку, указав, что этот thought id был этим Добавлен в избранное user.

Я бы предпочел, чтобы он хранил несколько username в одном поле. Так favourited_by, например, может содержать данные, как это:

Alice, Fred, Freddy, Conor .... 

Все в одном ряду. Я попытался объединиться с data types на phpMyAdmin, но не могу понять, как поле может хранить несколько данных.

+1

Плохая идея, вы, вероятно, должны иметь отдельную таблицу с отдельными строками. Но если вы собираетесь это сделать, возможно, 'json_encode()'. – AbraCadaver

+5

Вы так сожалеете о вышеупомянутом решении.Попросив сообщество помочь с этим, попросите людей на улице, как лучше всего с завязанными глазами с ножницами в руке. – PeeHaa

+1

Чтобы уточнить, что сказал @PeeHaa, вы * действительно * должны исследовать нормализацию базы данных и идти по этому пути вместо того, чтобы пытаться сделать все это в один столбец. – mituw16

ответ

0

Что вы спрашиваете, является неправильно сделать это. Вы не должны сериализовать данные избранного в текстовое поле для таблицы user или таблицы thought. Это разрушает всю цель использования реляционной базы данных, такой как MySQL.

правильный путь сделать это: создать таблицу перекрестных ссылок между user таблицы и thought таблицы. Это использует таблицу «многие-ко-многим» для хранения списка избранных, используя первичные ключи строки thought и строку user.

Ваш новый favorite стол:

CREATE TABLE IF NOT EXISTS `favorite` (
    `id` int NOT NULL AUTO_INCREMENT, 
    `user_id` int NOT NULL, 
    `thought_id` int NOT NULL, 
    PRIMARY KEY (`id`) 
); 

Что это делает взять id из user таблицы и сохранить его в favorite.user_id, затем сохраняет id из thought таблицы в favorite.thought_id.

Чтобы добавить новый фаворит для пользователя с идентификатором 123, для мысли с идентификатором 456:

INSERT INTO favorite (user_id, thought_id) VALUES ('123', '456');

Получить пользователей, которые ознаменовали мысль с идентификатором 456, как их любимый (используя JOIN):

SELECT u.* FROM favorite AS f 
    JOIN user AS u ON u.id = f.user_id 
    WHERE f.thought_id = 456; 

И похоже на последний запрос, получить любимые мысли для пользователя с идентификатором 123:

SELECT t.* FROM favorite AS f 
    JOIN thought AS t ON t.id = f.thought_id 
    WHERE f.user_id = 123; 
0

Идеальный способ справиться с этим - сопоставить его с другой таблицей, однако вы можете просто сохранить его как json.

MySQL 5.7 даже включает JSON как тип данных, позволяющий упростить фильтрацию и манипуляцию.

https://dev.mysql.com/doc/refman/5.7/en/json.html

Вы можете поместить в JSON любого текстового поля, однако, если вам не нужно искать его и т.д.

Смежные вопросы