колонки динамической базы данных? - PullRequest
0 голосов
/ 14 октября 2011

Предположим, у меня есть веб-сайт, на котором я предлагаю пользователю связать свои учетные записи в социальных сетях, такие как Facebook, Twitter, ... со своей учетной записью на моем веб-сайте.Сейчас я поддерживаю Facebook и Twitter на сайте, но позже я добавлю больше.Так что в настоящее время у меня есть таблица в базе данных для каждой поддерживаемой социальной сети, например, таблица Facebook, которая будет иметь идентификатор пользователя facebook и хэш безопасности и все, что мне нужно в приложении.эта таблица имеет идентификатор пользователя внешнего ключа для таблицы пользователей для пользователей на веб-сайте.Теперь предположим, что я хочу знать для каждого пользователя, какие социальные сети связаны с моим веб-сайтом, поэтому я решил добавить столбец в пользовательскую таблицу varchar.И у меня будет последовательность в этом примере, например, если пользователь связывает учетную запись Facebook и Twitter, значение будет «11», если он связывает только Facebook, значение будет «10» и т. Д.,Это хороший способ создать такую ​​вещь?

Также, когда я хочу поддержать новую социальную сеть, скажем, Google+, все, что мне нужно сделать, это добавить таблицу GooglePlus таблицы в базу данных, а затем написатьскрипт, который добавит символ в существующий столбец, изначально все пользователи будут иметь все, что у них было до + '0'Таким образом, у первого пользователя будет «110», а у второго - «100».И так далее.

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

Пример, чтобы прояснить вопрос:

Таблица пользователей:

User_Id    LinkedSocialNetworks
   1          '100'
   2          '101'

каждый символ в связанных социальных сетях представляет флаг либо этотПользователь связывает (1) свою учетную запись с указанной социальной сетью или нет (0).Как разработчик приложения, я знаю, что первый символ предназначен для Facebook, второй - для Twitter, Google+, ....

Из проверки таблицы пользователей я знаю, что пользователь 1 связывает свой аккаунт сFacebook, пользователь 2 связывается с Facebook и Google +, но не с твиттером.

После получения этой информации для пользователя 1 я получу его информацию только из таблицы Facebook, для пользователя 2 я получуего информация из таблицы Facebook и Google +.

Кстати, я использую MySql

Ответы [ 2 ]

2 голосов
/ 14 октября 2011

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

UserID UserName Preferences...
3      janeDoe123 ...
4      johnDoe456 ...

FaceBookUsers
UserID FBUserID FBUserName  ....
3      234322   janey
4      3453434  johnperson

MySpaceUsers
UserID MySpaceUserID MySpaceUname MySpaceThing2  ....
3      23423234 jj324 ...
4      323      jps2432dawg ...

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

Идея в том, что вы не добавляете столбцы каждый раз, когда появляется новая социальная сеть, и при этом вам не нужно пересчитывать некоторую формулу и обновлять все строки, на которые влияет формула (-это кошмар обслуживания).Вместо этого вы просто запрашиваете в каждой таблице уникальный идентификатор вашего пользователя, чтобы узнать, существуют ли они в этой социальной сети.(например, так как ваш John Doe имеет идентификатор пользователя 4, вы проверяете, есть ли у него учетная запись FB, запросив строку с идентификатором пользователя 4)

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

[b] Альтернатива [/ b] Я не понимаю, почему вы делаете всю эту работу для битовой строки, которая задает отношения типа 1010110.Вы можете использовать MySQL TINYINT (1) для минимального объема памяти и сделать что-то вроде этого:

UserID UserName Preferences... HasMySpace HasGooglePlus HasFB
3      janeDoe123 ...             0            1         0
4      johnDoe456 ...             0            1         0

Я думаю, что значения столбца по умолчанию (ноль или 0) здесь пригодятся.Таким образом, вы добавляете новый столбец в основную таблицу каждый раз, когда появляется новая сеть, но он достигает того же эффекта, что и в настоящее время, с немного меньшей нагрузкой.

0 голосов
/ 14 октября 2011

Я бы предпочел что-то вроде

CREATE TABLE users (id INT NOT NULL auto_increment PRIMARY KEY, ... );
CREATE TABLE social_networks (id INT NOT NULL auto_increment PRIMARY KEY, 
 name varchar(50), ...);
CREATE TABLE users_social_networks (user_id INT NOT NULL, 
 social_network_id INT NOT NULL, social_id VARCHAR(100) NOT NULL, 
 social_name VARCHAR(100), 
  PRIMARY KEY (user_id, social_network_id), 
  UNIQUE(social_network_id, social_id), 
   FOREIGN KEY (user_id) REFERENCES users(id), 
  FOREIGN KEY (social_network_id) REFERENCES social_networks(id));
...