0

所以我有 3 个表:用户、帖子、私人。在此示例中,lizzy 创建了一个私人帖子“约会”,并且只希望她的女朋友在私人表中看到它“authorized_user_ids”,而她自己在帖子表中看到“user_id”。

users
user_id   user_name
   1        tony
   2        steph
   3        lizzy
   4        adam
   5        lara
   6        alexa


posts
post_id   user_id   post_name   private (0 is public, 1 is private to authorized users)
   1         1       Coding        0
   2         3       Dating        1
   3         3       Show Me       0

private
private_id   post_id   authorized_user_ids
    1           2             2,5,6

只有私人发帖者 user_id 和 authorized_user_ids 可以看到 lizzy 的“约会”帖子,但每个人都应该可以看到 lizzy 的“Show Me”帖子。注销的用户和未授权的用户不应该看到任何东西。这是最有效的方法吗,还是应该是:

private
private_id   post_id   authorized_user_id
    1           2               2
    2           2               5
    3           2               6

这是我的第一个问题。我的第二个是从 mysql 数据库中提取数据时在 php 中解决它的最佳方法(显示到 authorized_user_ids)是什么?我们是否根据帖子表中的“私人”标志进行第二次查询?如果是1,我们在while循环中查询,从私有表中获取'authorized_user_ids',如果匹配到登录用户的$logged_in_id,那么我们显示'Dating'?或者是否应该在主查询中使用私有表和帖子表中的“post_id”与“授权_user_ids”进行连接?任何有关如何最有效地做到这一点的帮助表示赞赏。

4

1 回答 1

2

第一个问题:我肯定会选择第二个版本。将authorized_user_id存储为 CSV 将导致数据库读取和写入操作的效率大大降低,因为您最终会在应用程序代码中一直拆分 CSV 值并生成错误的动态 SQL 语句以处理更新。您永远不必编写 PHP 代码来帮助找到不同数据集的交集,使用 SQL。

第二个问题:使用连接,例如不使用 while 循环

SELECT DISTINCT p.post_id, p.post_name FROM users as u
JOIN posts as p on p.user_id=u.user_id 
LEFT JOIN private pv on pv.post_id=p.post_id
WHERE (p.private=0) OR  (authorized_user_id={$logged_in_id} and p.private=1)

上面(或非常相似)将列出所有帖子 $logged_in_id 为 2,但仅当 $logged_in_id 为 4 时才列出公共帖子等。

于 2013-01-22T00:11:55.890 回答