Простой вопрос проектирования базы данных - PullRequest
2 голосов
/ 21 сентября 2009

Я занимаюсь разработкой веб-приложения с поддержкой php и mysql. У меня есть таблица с именами пользователей, в этой таблице я храню некоторую информацию, такую ​​как имя пользователя, имя и фамилия, номер телефона и т. Д. В моем приложении пользователь может ввести НЕОБЯЗАТЕЛЬНУЮ информацию, такую ​​как параметры рассылки электронной почты, название компании (если работает .. ) или URL веб-сайта. Вся эта информация (приложение имеет около 20 необязательных типов информации) является необязательной. В такой ситуации какой дизайн базы данных будет правдой?

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

Ответы [ 8 ]

6 голосов
/ 21 сентября 2009

Если вы сериализуете дополнительные данные в один столбец, используя сериализацию php, вы никогда не сможете запросить эти данные. То есть, если вы хотите запросить пользователя с таким веб-сайтом, как "http://www.foo.com",, вы не можете сделать это, потому что эти данные сериализованы.

Как правило, я не люблю хранить сериализованные данные в моей базе данных, если нет возможности обойти это.

2 голосов
/ 21 сентября 2009

Зачем вы это делаете?

Нет никакой выгоды: вы не можете запросить это, это довольно непонятно для любого другого разработчика, который не знает об этом? и т.д.

Лучше всего иметь 1 поле для каждой дополнительной информации и установить «Nullable». Если пользователь ничего не вводит, то строка содержит DBNull.

1 голос
/ 21 сентября 2009

Добавить дополнительную таблицу OptionalInformation с тремя столбцами:

  • FK_UserID
  • OptionalFieldName
  • Значение

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

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

0 голосов
/ 21 сентября 2009

Сериализация не позволяет запрашивать определенные данные. Определенно вы можете знать, кто и все выбрали рассылку. Затем вам следует хранить каждую информацию в отдельном столбце.

У вас может возникнуть желание использовать значения NULL для необязательных столбцов. Но с точки зрения производительности значения NULL создают нагрузку на сервер с точки зрения индексации и сортировки. Поэтому рекомендуется иметь пустую строку или ноль в качестве значений по умолчанию для столбцов. А из PHP вы можете проверить состояние с помощью метода empty ().

0 голосов
/ 21 сентября 2009

Я уверен, что есть много способов сделать это как единое целое в вашей схеме.

Сериализация, таблица соответствия значений ключей и т. Д. И т. Д. *

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

0 голосов
/ 21 сентября 2009

Добавление этих необязательных полей в качестве нескольких полей таблицы или одного «ДОПОЛНИТЕЛЬНОГО» зависит от приложения в причине, но я бы сказал, что если вы уверены, , что ни одно из этих полей не будет использоваться в любом путь для запросов SQL, то это должно быть в порядке.

Стоит отметить, я бы НЕ использовал serialize (), а вместо этого:

$json = json_encode($data);

и

$data = json_decode($json, true)

в отличие от serialize (), json может быть не сериализован в другом месте (javascript / browser), безопасен в двоичном формате, а также удобочитаем для человека.

0 голосов
/ 21 сентября 2009

Я бы просто выбрал одну таблицу - пользовательскую, с необязательными полями, имеющими значение по умолчанию NULL.

0 голосов
/ 21 сентября 2009

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

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

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

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

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