Динамические столбцы в таблицах mysql? - PullRequest
1 голос
/ 31 мая 2010

Я хочу добавить динамические столбцы в таблицу mysql, но не знаю точно, как.

Я хочу, чтобы пользователь мог добавить несколько столбцов (полей) в поток, например. пусть он добавляет целочисленное поле и значение (например, цена: 199) или строковое поле и значение (например, имя: teddybear).

Пользователь может добавить столько пар / значений, сколько ему нужно.

Я думал, что смогу создать таблицу "многие ко многим":

thread <-> thread_field <-> field

thread: id, title
thread_field: field_id, thread_id, value
field: id, name

это хорошая структура?

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

Как я могу это сделать?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 31 мая 2010

Уродливый путь:

thread_field: field_id, thread_id, value_text, value_int

где value_text объявлен TEXT, а value_int объявлен INT.

Для любой данной записи вы используете только одно из двух полей.

2 голосов
/ 31 мая 2010

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

Если вам нужно разрешить пользовательские атрибуты в реляционной базе данных, самое простое решение - сохранить Сериализированный BLOB , такой как XML или другой полуструктурированный формат (JSON, YAML). Вы теряете возможность эффективно выполнять запросы с помощью SQL (если только вы не используете RDBMS, которая расширяет SQL с помощью функций и индексов XML), но вы собираетесь пожертвовать многими функциями RDBMS независимо от того, как вы решаете эту проблему.

Другой альтернативой является использование одного из новых нереляционных хранилищ данных , таких как CouchDB или MongoDB , что позволяет легко расширять сущности с помощью динамических, структурированные атрибуты, оставаясь несколько эффективными.

1 голос
/ 31 мая 2010

Если вы хотите, чтобы ваш пользователь ввел произвольные пары ключ => значение, вы можете посмотреть на вертикальную таблицу. Что-то вроде:

post_id, keyname, keyvalue
1, 'name', 'teddybear'
1, 'price', '1.99'
2, 'colour', 'fuchsia'
78, 'mother', 'Diana'
78, 'father', 'Bob'
78, 'pet', 'Fido'

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

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

1 голос
/ 31 мая 2010

Вы можете добавить тип данных в таблицу 'fields' и сохранить строку или двоичный объект, а затем преобразовать его в нужный тип в вашем коде, хотя вам придется выполнить всю проверку в коде.

Вы также можете добавить другие свойства в поле, такие как Необязательное или Требуемое значение, Видимость и т. Д.

0 голосов
/ 31 мая 2010

Ты не должен этого делать.
Пользователи сайта не имеют абсолютно никакого отношения к структуре базы данных.

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

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