用于创建组和邀请用户的适当表结构


Proper table structure for creating groups and inviting users

我有以下表格

users: uid, name_f, name_l...

group_data: id, group_id, admin, invitedusers, subscribers...

例如,当用户"uid:4"创建一个组并邀请他的朋友"uid:7"answers"uid:9"时,我将其插入组数据表:

'admin:4, invitedusers:4,7,9, subscribers:4,7,9'. I

例如,如果uid:9不想接收通知,我只需将他/她从逗号分隔的列表、订阅者中删除,使其成为'subscribers:4,7'。当管理员从组中删除用户时,我也会这样做,只是我更改了invitedusers列。

我知道这个设置有很大的缺陷,我必须为受邀者和订阅者创建一个新的表。我只是在寻找一种创建该表的方法,以及一个选择新系统中所有用户的sql查询。

任何帮助都将不胜感激。此外,这个答案有点触及主题,但我不太理解结构参考,无法实现它:SQL数组搜索

你应该有一个表,每个用户都有一行,就像你已经做的那样。称之为"users"。此表将只包含有关用户的信息,而不是用户所在的组

你应该有另一个表,每个组一行,你做到了。称之为"groups"。此表将只包含有关组的信息,而不包含组中的人员。

你应该有一个第三个表,每个用户所在的组都有一行。可以称之为"user_groups"之类的。该表中的每一行都将"users"表中的一个用户链接到"groups"表的一个组,并可能提供有关他们对该组的订阅的信息。

示例设置可能看起来像:

CREATE TABLE users (
    userID INT,
    firstName VARCHAR,
    lastName VARCHAR,
    PRIMARY KEY (userID)
);
CREATE TABLE groups (
    groupID INT,
    groupName VARCHAR,
    adminUserID INT,    /* this is the userID of the one and only administrator of this group */
    PRIMARY KEY (groupID)
);
CREATE TABLE user_groups (
    userID INT,
    groupID INT,
    invited TINYINT,    /* 0 or 1 to indicate true or false */
    subscribed TINYINT  /* 0 or 1 to indicate true or false */
);


编辑回答评论中的问题:

$groupID = 1;
$userIDArray = explode(",", $row["invitedusers"]);    // assuming that $row is a row from the old group_data table
foreach ($userIDArray as $userID)
    mysql_query("INSERT INTO user_groups (userID, groupID, invited) VALUES ('". mysql_real_escape_string($userID) ."', '". mysql_real_escape_string($groupID) ."', 1)");

糟糕的性能,但对于一次性来说已经足够了

 -- create table
 CREATE TABLE invitedusers (group_data_id integer,user_id integer, PRIMARY KEY(group_data_id,user_id));
 --  insert existing users
 INSERT IGNORE INTO invitedusers (group_data_id,user_id)
 SELECT g.id, u.id
 FROM users u
 JOIN group_data g
 ON FIND_IN_SET(u.id,g.invitedusers) > 0