2010-07-08 2 views
0

Разработка веб-сайта пользовательского контента (вид похож на визг, но и для другого рынка и обмен фотографиями) и имел несколько одной базы вопросов:Несколько вопросов проектирования баз данных, связанных с пользовательским контентом сайта

  1. Получает ли каждый пользователь их собственный набор таблиц или мы храним несколько пользовательских данных в общие таблицы? С это даже социальная сеть, когда размеры пользователей растут для масштабируемости Базы данных обычно разделяются на . Различные наборы пользователей - отправлены отдельно, так что же лучший подход? Я думаю, что некоторые данные, например, , могут быть общими учетными записями пользователей , но настенные сообщения, фотографии и т. Д. каждый пользователь получит свой собственный стол? Если да, то, если у нас есть 10 миллионов пользователей, значит, 10 миллионов x какое количество таблиц на пользователя? Это в настоящее время разрабатывается в MySQL

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

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

  4. Если все это верно, это означает, что мы поддерживаем 1 мастер-набор таблиц с системными значениями по умолчанию, то каждый пользователь получает одинаковое значение, скопированное в их таблицы? В некоторых полях, например, «Максимум неудачных попыток входа в систему» ​​перед блокировкой учетной записи системы. Один из них имеет системную ошибку по умолчанию 5 попыток входа в течение 30 минут. Но я хочу, чтобы пользователи также указали свой собственный номер, чтобы настроить свою выигранную безопасность, поэтому это означает, что они могут перезаписать системный дефолт в своей собственной таблице?

    Спасибо.

ответ

1
  1. Пользователи не должны получить свой собственный набор таблиц. Это, скорее всего, не будет работать так же хорошо, как одна таблица (правильно проиндексирована), а изменения схемы должны быть развернуты до всех пользовательских таблиц.
  2. У вас могут быть значения по умолчанию, указанные в таблице для вещей, которые являются необязательными.
  3. С трудом. С одним набором таблиц это будет намного проще и, вероятно, быстрее.
  4. Такие данные должны храниться в таблице пользовательских настроек, в которой хранятся все настройки для всех пользователей. Опять же, не дублируйте схему для всех пользователей.
1

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

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

Это позволяет видеть таблицу как 1 объект, хотя она логически разделена - СУБД обрабатывает большую часть работы и представляет вам 1 объект. Таким образом, вы SELECT, INSERT, UPDATE, ALTER и т. Д., Как обычно, и DB определяет, к какому разделу относится SQL и выполняет ли эта команда.

Не разделение таблиц пользователями, вместо использования индексов и разделов, будет иметь дело с масштабируемостью при сохранении производительности. если вы не разделяете таблицы вручную, это также делает точки 2, 3 и 4 спорными.

Вот ссылка на таблицы секционирования (SQL Server конкретным): http://databases.about.com/od/sqlserver/a/partitioning.htm

+0

Запрос будет выполнен путем объединения некоторого ключа (возможно, имени пользователя) в имя таблицы. Итак, если пользователь «Боб», таблица для фотографий будет «Bob_Photos» (хотя уникальный идентификатор пользователя будет лучше, чем их имя). Это выполнимо, но только если ничего не сделают (и я еще не видел такой ситуации). – FrustratedWithFormsDesigner

+0

Я определенно думаю, что запрос можно сделать, просто подумайте, что это может быть громоздким. Я немного уточнил свой ответ. Благодарю. – programatique

0

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

+0

Меня беспокоит размер стола. Существует интенсивное отслеживание пользователей и запись каждого пользовательского движения на месте. Если вы считаете, что Google плох, вы будете ненавидеть нас! Следовательно, база данных станет монстром для управления, поэтому я не уверен в техническом аспекте, как большие таблицы могут расти, прежде чем нам нужно разбить его или что-то в этом роде. – Jarred

0

Похоже, вам нужно найти учебник по основам баз данных реляционных баз данных. Независимо от типа приложения, которое вы разрабатываете, вы должны начать там. Узнайте, как работают объединения, индексы, первичные и внешние ключи и т. Д. Узнайте о нормализации базовой базы данных.

Нестандартно создавать новые приложения «на лету» в приложении; он обычно не нужен в правильно разработанной схеме. Обычно изменения схемы выполняются во время развертывания. Единственный раз, когда «пользователи» получают свои собственные таблицы, является артефактом решения о предоставлении услуг, в котором каждый «пользователь» фактически является арендатором в огороженном саду; это имеет смысл только в том случае, если каждый «пользователь» (скорее, компания или организация) никогда не нуждается в доступе к чему-либо, что хранят другие пользователи в системе.

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

Добавление, на основе ваших обновленных комментариев/заметок:

Ваши опасения по поводу количества записей в конкретной таблице, скорее всего, преждевременно. Сначала сделайте что-то работающее. Большинство современных СУБД, включая более новые версии MySql, поддерживают механизмы за пределами индексов и кластерные индексы, которые могут помочь справиться с большим количеством записей. Например, в MS Sql Server вы можете создать функцию разбиения по полям таблицы; MySql 5.1+ имеет несколько аналогичных параметров разбиения на основе хеш-функций, диапазонов или других механизмов. Следуйте хорошо зарекомендовавшим себя соглашениям по проектированию баз данных, которые максимально влияют на ваш домен, а затем приступят к проблемам. Сначала настройте с помощью инструментов, доступных в вашем выборе базы данных, а затем рассмотрите более радикальные меры только тогда, когда вы сможете доказать, что они необходимы. Существуют и другие виды денормализации, которые с большей вероятностью будут иметь смысл, прежде чем вы захотите рассмотреть вопрос о том, что что-то как унииоматическое для систем баз данных является моделью «таблица для каждого пользователя»; даже если бы я посмотрел на этот маршрут, я бы, вероятно, сначала рассмотрел нечто вроде материализованных представлений.

0

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

Общий подход к очень крупным сайтам - database sharding. Резюме: у вас есть N экземпляров вашей базы данных параллельно (на отдельных машинах), и каждый из них содержит 1/N общих данных. Существует некоторый общий способ узнать, какой экземпляр содержит данный бит данных. Для доступа к некоторым данным у вас есть 2 шага, а не 1 можно было бы ожидать:

  1. Потренируйтесь, который осколок содержит данные
  2. Go к этому осколку для данных

Есть проблемы с это, например: вы настраиваете, например 8, и все они заполняются, поэтому вы хотите поделиться данными, например. 20 осколков -> миграция данных между осколками.

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