用于创建组和邀请用户的正确表结构

时间:2012-02-29 17:16:02

标签: php mysql sql

我有以下表格

users: uid, name_f, name_l...

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

当用户,'uid:4'例如创建一个组并邀请他的朋友'uid:7'和uid:9'我插入到group_data表中:

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

例如,如果uid:9不想接收通知,我只需将他/她从逗号分隔的列表中移除,订阅者将其设为'subscribers:4,7'当管理员删除用户时我也会这样做来自该组,除了我改变了inviteusers专栏。

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

非常感谢任何帮助。此外,这个答案有点触及了这个主题,但我不太了解结构参考,也无法实现它:SQL Array Search

2 个答案:

答案 0 :(得分:3)

对于每个存在的用户,您应该拥有一个包含一行的表,就像您已经做过的那样。称之为“用户”。此表将仅包含有关用户的信息,而不是他们所在的组。

您应该有另一个表,每个组都有一行,您可以这样做。称之为“群组”。此表将仅包含有关该组的信息,而不是其中的人员。

对于他们所在的每个组,您应该为每个用户创建第三个表,其中包含一行。将其称为“user_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)");

答案 1 :(得分:0)

性能糟糕,但一次性足够好:

 -- 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
相关问题