首先是什么条件。我有属于“小”组的人。 (换句话说,每个人都有“small_group_id”。然后“小”组形成“大”组(换句话说,“small_groups”可能或不具有“big_group_id”,这取决于小组是否属于更大的组合)。
我想创建一个表结构(将由PHP使用)来保存和显示以下两个内容:
基本上我面临的挑战是如何设计并随后处理这些私人消息的可见性。
我的第一个表格如下:msgID, msgBody, small_groups_list, big_group_list, authorID
所以我存储了例如在'small_groups_id'
类似'id_1; id_4; id_10'
之类的内容,类似于大型群组。但是,我不知道如何在例如搜索这些存储的列表时进行搜索。属于small_group_id = 10的人应该看到那个消息。另外,列small_groups_list
和big_group_list
defenitions / types应该是什么。
也许有更好的方法存储这些东西并使用它们? 这就是我在这里的原因。对这些要求有哪些更好的做法?
(它将在mySQL上实现)
提前谢谢。
[编辑] 我对SQL和DB事情都很缺乏经验。请在回答时考虑到这一点。
答案 0 :(得分:2)
首先:不要使用“数组”列对数据进行非规范化。这使得查询更加恐怖,甚至更糟更新。
相反,您需要两个单独的表:small_group_visibility
和big_group_visibility
。这两个表中的每一个都包含msgID
和groupID
。基本上,这是一个多对多的关系,指出了它所关注的群体和信息。
这是一种非常常见的数据库模式。
要查询要显示的消息,假设我们有一个小组为(1,2,3)且其大组为(10,20)的用户。
SELECT DISTINCT msgID, msgSubject, msgBody -- and so on
FROM messages m
LEFT JOIN small_group_visibility sg
ON sg.msg_id = m.msg_id
LEFT JOIN big_group_visibility bg
ON bg.msg_id = m.msg_id
WHERE
sg.group_id IN (1, 2, 3) OR
bg.group_id IN (10, 20);