2010-12-13 3 views
1

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

Теперь, чтобы сделать это, я думал, что из двух решений:

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

  2. Ведение таблицы с именем профилей, в которой каждый пользователь имеет идентификатор профиля и другие его данные профиля, как указано выше, и имеют отдельную таблицу друзей для каждого пользователя, которая говорит что-то вроде friends_profileid, и каждый пользователь имеет свой собственный список друзей, который имеет всю другую информацию.

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

В то время как вторая методика уменьшает над головой поиска в одной таблице, каковы накладные расходы на сохранение схемы снова и снова? Каков наилучший метод для такого типа ситуации?

ответ

3

SQL был разработан для работы с переменным числом строк над фиксированным набором отношений.

Проблемы с 1-таблицы для каждого пользователя (в непосредственной близости от верхней части моей головы):

  1. Штука с кучей труднодоступные доступа и труднодоступные поддержания таблиц. Нет простого способа запуска запросов, охватывающих несколько пользователей. Ограничивает размер запроса, чтобы попытаться «разложить» эти таблицы в одном запросе. Большинство слоев SQL/ORM не обеспечивают хороший способ справиться с этим.
  2. Генерируемые запросы должны быть «динамическими» с замененными таблицами. Хотя это не «меняет форму», для статического анализатора трудно/невозможно узнать это (возможно, это представило бы понятие «шаблон» - больше сложности. нет, спасибо!). Это относится к проверке правильности SQL DDL/DQL (если такие инструменты используются), удаляет возможность использования ORM без статического кода без дополнительной работы и накладывает больше нагрузки на процессор/анализатор запросов.
  3. Может/также обычно приводит к ухудшению планов запросов и общую производительность, как и в общем случае, каждая таблица (скажем 100k? Нет, спасибо!) Должны были бы быть лечиться самостоятельно с потенциально огромным недостатком логического местонахождение. Вы также можете нажимать на некоторые верхние пределы РСУБД (с другой стороны, таблицы с 2 миллионами записей «маленькие»).

Заключение: Пожалуйста, используйте RDBMS свои сильные стороны - мир работать на SQL на протяжении десятилетий (по крайней мере 2 ;-) и большинство [тривиальные] проблемы были решены несколько раз.

0

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

Используйте это, чтобы управлять дизайном базы данных, а затем инкапсулировать структуру базы данных за хорошо определенными API-интерфейсами, которые выполняют все необходимые соединения за кулисами.

1

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

Традиционный способ сделать это, я думаю, будет использовать присоединиться таблицу создать двунаправленной, многие-ко-многим сопоставление между пользователями. В таблице будет два столбца, оба из которых - внешние ключи в первичный ключ таблицы users. Запись в таблице соединений (назовите ее user_friends) представляет собой «дружбу» между двумя пользователями.

+0

Я согласен с вами, но считаю следующее: Скажем, у меня есть пользователи 1 и 2, теперь пользователь1 может классифицировать пользователя 2, чтобы быть в группе A, в то время как user2 классифицирует 1, чтобы быть в B. Таким образом, очевидно, что я должен сохраните значения 1 и 2 и 2 и 1 в таблице user_friends. Теперь скажите, что у меня 1000 пользователей, и у каждого из них 50 друзей, теперь размер таблицы будет равен 50 000, и каждый раз, когда мне приходится запрашивать список друзей, будет огромная накладная, и мне нужно будет найти список друзей часто. Время выполнения запроса увеличивается экспоненциально даже для небольшой базы данных .. это целесообразно ..? – sasidhar

+0

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

+0

@sasidhar: когда вы говорите _ «традиционный сайт социальной сети» _, я думаю, что Facebook. На Facebook дружба взаимная. Если A дружит с B, B также должен быть друзьями с A; наоборот, A не может дружить с B, если B не дружит с A. Это ограничивает размер вашей таблицы, потому что вам нужно только перечислить каждую дружбу один раз. –

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