我是MySQL新手。我正在尝试设计一个在线文件存储系统。实际的文件存储将分别处理 - 我只想使用MySQL来创建文件元数据的数据库(例如文件名,文件大小,文件类型,权限等)。我的系统最多需要处理1000个用户,每个用户最多可以存储1000个文件。
我想创建一个文件记录数据库。最好是为每个用户创建一个文件记录表,然后创建另一个列出用户和引用相应表的表吗?或者我应该制作一个大的文件记录表,然后简单地包含一个名为“user”的列?
我认为多表方法的优点是我永远不必逐步完成1,000,000条记录。但是我对mySQL了解不多,所以我不知道是否有1,000,000条记录需要通过。
答案 0 :(得分:5)
我会在一张表中找到所有文件记录。对于MySQL来说,100万条记录并不是那么重要 - 我使用的记录比没有任何问题的记录多100倍。
确保您的索引良好。另外考虑使用InnoDB引擎而不是MyISAM,尽管在使用InnoDB时损失的性能与获得行级锁定的好处之间存在折衷。
一个表与多个表的优点是要进行单个 SQL查询,例如:
系统中所有文件的总大小是多少:
SELECT SUM(size) FROM files
按文件大小(或计数)显示前N个用户:
SELECT user, SUM(size) AS total FROM files GROUP BY user ORDER BY total DESC LIMIT 10
告诉我最后N个修改过的文件:
SELECT * FROM files ORDER BY mtime DESC LIMIT 10
如果每个用户都有一个单独的表格,那么所有这些就不可能有效实施。
答案 1 :(得分:5)
你应该制作一个大的文件记录表,并简单地包含一个名为“user”的列。您不创建存储完全相同信息的单独表。
编辑:您应该创建一个包含存储对用户的引用的列的大表。有人建议userid是一个合适的名字,但你可以随意调用它。实际的用户信息需要在一个单独的表中(通过此键链接)。
答案 2 :(得分:1)
最好有多个表,因为这样可以避免表锁的瓶颈。
为了让你开始我给你三张桌子:
users: user_id(PK) | name | surname | ...
files: file_id(PK) | file_name | file_extension | upload_date | ...
users_files: (user_id | file_id )(PK)
注意:users_files
应该包含由两个字段组成的复合主键。
第三方编辑:[澄清,因为人们可能看不到所有评论]下面的许多评论是基于初始答案,仅包括第一行并被解释为含义一个单独的表每个用户。
答案 3 :(得分:1)
当然,一张大桌子; MySQL强大,高效,快速,不会记住一百万条记录。使用单个表,您可以编写更简单的查询来检索任何数据,例如:
确保正确创建索引,这取决于您打算运行的查询类型。
此外,如果您的表格不会频繁写入,我建议您使用MyISAM存储引擎,因为它具有更高的性能。但是,如果相反,请使用支持行级锁定的InnoDB,因此锁定冲突更少。
希望你很快就能体验到MySQL的乐趣: - )
答案 4 :(得分:-1)