SQL:寻求表结构的建议等

时间:2014-02-14 01:52:20

标签: mysql sql

首先是什么条件。我有属于“小”组的人。 (换句话说,每个人都有“small_group_id”。然后“小”组形成“大”组(换句话说,“small_groups”可能或不具有“big_group_id”,这取决于小组是否属于更大的组合)。

我想创建一个表结构(将由PHP使用)来保存和显示以下两个内容:

  • 公共信息(指任何被重新建立甚至没有的人都能看到它)。只有邮件的作者才能编辑/删除。这很容易:)
  • 私人消息WITH定义私有程度。这意味着私人电子邮件应具有财产a)小团体可以看到什么b)大团体可以看到它(假设所有大团体成员都有权看到它)。

基本上我面临的挑战是如何设计并随后处理这些私人消息的可见性。 我的第一个表格如下:msgID, msgBody, small_groups_list, big_group_list, authorID所以我存储了例如在'small_groups_id'类似'id_1; id_4; id_10'之类的内容,类似于大型群组。但是,我不知道如何在例如搜索这些存储的列表时进行搜索。属于small_group_id = 10的人应该看到那个消息。另外,列small_groups_listbig_group_list defenitions / types应该是什么。

也许有更好的方法存储这些东西并使用它们? 这就是我在这里的原因。对这些要求有哪些更好的做法?

(它将在mySQL上实现)

提前谢谢。

[编辑] 我对SQL和DB事情都很缺乏经验。请在回答时考虑到这一点。

1 个答案:

答案 0 :(得分:2)

首先:不要使用“数组”列对数据进行非规范化。这使得查询更加恐怖,甚至更糟更新。

相反,您需要两个单独的表:small_group_visibilitybig_group_visibility。这两个表中的每一个都包含msgIDgroupID。基本上,这是一个多对多的关系,指出了它所关注的群体和信息。

这是一种非常常见的数据库模式。

要查询要显示的消息,假设我们有一个小组为(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);