我想弄清楚我的文档共享系统方法是否合适(我使用的是 PHP 和 SQL)。我想我建立了一个糟糕的数据库设计。
简单来说,这个概念就是创建文档、与他人共享、使用评论系统获取更新和反馈。
用户可以与网络(内联网)上的任何其他用户共享他们的文档。用户可以访问其他用户与他们共享的文档并发表评论。
这是我的数据库架构
(删除了一些列,例如:created_time、user_ip...等)
- documents:
----------------------
-- document_id
-- document_title
-- document_content
-- document_category
- comments:
----------------------
-- comment_id
-- comment_content
-- document_id
-- user_id
- users:
----------------------
-- user_id
-- user_name
-- user_type
-- user_password
- permissions:
----------------------
-- document_id
-- user_id
用户登录系统后,PHP 将使用此 SQL 查询查看他可以访问的所有文档:
SELECT d.document_title
FROM documents AS d, permission AS p
WHERE d.document_id = p.document_id AND p.user_id = '12'
上述查询也用于授予文档的访问权限
现在想象一下,为通过网络与 200 位用户共享的单个文档创建的行数,在权限表中将是 201 行!我认为这是一个糟糕的方法
我正在尝试采用一种不同的方法,将权限表更改为:
- permissions:
----------------------
-- document_id
-- users_ids
这将允许我将用户 ID 保存在每个文档的一列和一行中。但我不确定这是否是正确的方法,老实说我看不出我将如何使用 PHP 和 SQL 实现它
请给我建议并给我你的反馈
谢谢
最佳答案
首先,您的查询应该是:
SELECT d.document_title
FROM documents d JOIN
permission p
ON d.document_id = p.document_id
WHERE p.user_id = 12;
使用正确的 JOIN
语法。并且大概 user_id
是一个数字,所以比较应该是一个数字,而不是一个字符串。
其次,正如您描述的文档,它们似乎有所有者。所以,文档
应该有类似owner_user_id
的内容。或者,所有权可能是一种许可。
第三,权限通常有不同的类型——想到的是读取、写入和删除。因此,您可能需要权限类型。
第四,200 位用户有 200 行先验不是问题。您当然不希望通过存储与关系数据库实践相反的数据来修复它——即将整数转换为字符串以将多个值存储在单个列中。
相反,您可能需要考虑引入一些“组”的概念,以便用户可以加入组并且该组可以访问文档。
关于php - 文档共享系统的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606323/