Выбор базы данных, когда количество столбцов меняется - PullRequest
0 голосов
/ 28 декабря 2011

Если я собираюсь сохранить что-то вроде списка всех фильмов, которые нравится человеку на Facebook, количество столбцов на человека не является постоянным. Я прочитал несколько статей, которые не в пользу NoSQL. Есть ли взлом MySQL, который позволил бы мне сделать что-то подобное?

Ответы [ 3 ]

1 голос
/ 28 декабря 2011

Как я отметил в ответе на этот вопрос:

вставка в две таблицы в базе данных mysql одновременно

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

0 голосов
/ 28 декабря 2011

Вы можете сделать это с традиционными реляционными базами данных (такими как MySQL).

Поскольку это база данных schema-ful , вы не можете иметь различный набор столбцов для каждой строки. Однако у вас может быть один столбец (назовем его extra), который будет иметь тип TEXT (или BLOB).

Вы можете взять все свои переменные столбцы, сериализовать их в JSON (или XML, или Protobuf, или MessagePack, и т. Д.) И записать в этот специальный столбец.

Таким образом, вы можете записать произвольные данные в запись и по-прежнему использовать MySQL. Однако вы только что потеряли большую часть функциональности СУБД: индексацию, запросы и эффективные обновления этих данных. Теперь хранилище ключей / значений с постоянством!

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

Соберите как можно больше информации и примите обоснованное решение .

0 голосов
/ 28 декабря 2011

Нет необходимости в взломе, вам просто нужно спланировать схему, чтобы она была реляционной.

Например, предположим, что у вас есть таблица с именем Users, и в ней есть следующие поля: id,имя, адрес электронной почты, пароль.Его графическое представление будет выглядеть примерно так:

id | name |    email    | password
------------------------------------
1  | John | john@me.com | <md5 hash>
2  | Mark | mark@me.com | <md5 hash>
ETC...

Тогда, так как вы хотите хранить фильмы, которые понравились пользователю, вы можете иметь еще одну таблицу с именем UsersMovies, содержащую поля id, user_id, movie_id:

id | user_id | movie_id
-----------------------
1  | 1       | 187
2  | 1       | 486231
3  | 2       | 9843
4  | 1       | 457
ETC...

Эта вторая таблица будет содержать отношения между каждым пользователем и одним фильмом, который ему нравится.Это означало бы, что для user_id 1 вы бы знали, что ему нравятся фильмы с идентификаторами 187, 486231 и 457. Этот movie_id может содержать идентификатор фильма в Facebook или что-либо еще, идентифицирующее этот фильм как таковой.Модель, извлекающая все фильмы для пользователя X, будет проста: SELECT * FROM UsersMovies WHERE user_id='X', где X - идентификатор пользователя в таблице пользователей, а для извлечения всех пользователей, которым нравится фильм X, будет просто: SELECT user_id FROM UsersMovies WHERE movie_id='X'

Подробнее об этом можно прочитать в этом месте .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...