动态数据库列?

时间:2011-10-14 18:36:06

标签: mysql database database-design dynamic

假设我有一个网站,我提供用户将他的社交网络帐户(如facebook,twitter,...)与我的网站上的帐户相关联。现在我在网站上支持facebook和twitter,但后来我会添加更多。所以目前我在数据库中为每个支持的社交网络提供了一个表格,例如Facebook表格,它将具有facebook用户ID和安全哈希以及我在应用程序中需要的任何内容。此表具有网站用户的User表的外键用户ID。现在假设我想知道每个用户哪些社交网络与我的网站链接,所以我决定在varchar的用户表中添加一列。我将在其中有一个序列,例如,如果用户链接facebook和Twitter帐户,则值将为“11”,如果他仅链接facebook,则值为“10”,依此类推。这是设计这种东西的好方法吗?

另外,当我想支持一个新的社交网络说Google+时,我要做的就是在数据库中添加一个表GooglePlus表,然后编写一个脚本,将一个字符添加到现有列,最初所有用户将拥有+'0'之前的所有内容。因此第一个用户将拥有'110',第二个用户将拥有'100'。等等。

这是我在这种情况下可以遵循的最佳方法吗?这是一个可维护的设计吗?

澄清问题的一个例子:

用户表:

User_Id    LinkedSocialNetworks
   1          '100'
   2          '101'

链接的社交网络中的每个字符表示该用户正在将其帐户与指定的社交网络(0)链接(1)的标记。我知道,该应用程序的开发人员是第一个char用于facebook,第二个用于twitter,Google+,....

通过检查用户表,我知道用户1正在将他的帐户与Facebook相关联,用户2正在与Facebook和谷歌+进行链接,但不会与推特进行链接。

获取此信息后,对于用户1,我将仅从Facebook表中获取他的信息,对于用户2,我将从Facebook表和Google +获取他的信息。

我正在使用MySql

2 个答案:

答案 0 :(得分:2)

不,这不是一个好的设计理念。但是,对于每个社交网络,您的单独表格没有任何问题。相反,要将每个帐户链接到不同的人,请尝试这样的设计:

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 ...

您有一个用于在应用程序中使用的用户的常规表,并且该表具有将其他帐户上的其他社交用户身份联系在一起的唯一ID

这里的想法是,每次弹出新的社交网络时,您都不会添加列,也不必重新计算某些公式并更新公式影响的所有行( - 这是维护噩梦)。相反,您只需查询每个表以查找用户的唯一标识符,以查看它们是否存在于该社交网络上。 (例如,由于您的John Doe的用户ID为4,因此您可以通过queryinng检查其帐户是否具有用户ID为4的行)

我不太了解这个,告诉你是否为每个社交网络分别设置表是个好主意。我不确定是否有可能将每个网络的所有细节合并到一张桌子上,但我的直觉是它会变得一团糟。我在这里真的不知道,所以我不确定你的社交网络是一个好主意,但我认为这是正确的方法。

[b]另类[/ b] 我不明白你为什么要为指定1010110之类的关系的位字符串做所有工作。您可以使用MySQL的TINYINT(1)来实现最小的内存占用,并执行以下操作:

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

我认为列默认值(null或0)在这里会派上用场。这样,每次弹出一个新网络时,都会向主表中添加一个新列,但它可以达到与当前工作相同的效果。

答案 1 :(得分:0)

我宁愿拥有像

这样的东西
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));