php - 文档共享系统的数据库设计

标签 php mysql sql database database-design

我想弄清楚我的文档共享系统方法是否合适(我使用的是 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/

相关文章:

mysql - 总锁数超过锁表大小

mysql - 如何在流行的 SQL 平台上通过 SQL 查询请求数据库模式?

php - 如何使用 PHP 从持久 session 处理程序中检索特定信息?

php - Codeigniter 项目社交点火器

php - 将 HTML 表格下载到 MS Access

php - PHP 中的 `finally` 关键字是什么?

mysql - 如何在docker下创建测试数据库?

mysql - 在 mysql : how can I select the most recently added row when selecting by MAX if two values are equal (application is a games high score table)

php - Symfony 表单 - Choicetype - 错误 "Array to string covnersion"

php - 如何停止缓存 jquery php 加载的结果