【问题标题】:what is better, many repeated rows or increasing the tables?有什么更好的,很多重复的行或增加表格?
【发布时间】:2013-04-24 08:26:31
【问题描述】:

我有一个文件共享应用程序。我没有将文件存储在数据库中。它只是在文件夹中。这些是用户上传的文件。 现在每个文件都可以与多个用户共享,比如 1 个文件与千人共享。 我想以最简单的方式实现这一点,并牢记性能。现在我脑子里有两个选择。

1) 包含 id、所有者、文件名、文件路径、shared_with 等列的表(由 ',' 分隔的值。例如 user1、user2、user3)、日期。

2) 为每个用户创建一个表,其中包含 id、owner、filename、file-path 列。

我认为 1 选项更可取,但很难知道与特定用户共享了多少文件。无论如何,我问了因为可能会有更好的答案,谢谢我正在考虑选择这些选项。 谢谢和问候

【问题讨论】:

    标签: mysql hibernate database-design


    【解决方案1】:

    您的两个解决方案都有问题。

    使用第一个选项时,您会以逗号分隔的用户字段来共享文件。这样就几乎不可能有效地搜索用户共享的文件。

    在第二个中,您会遇到大量桌子。如果您想知道与您共享文件的所有用户,则需要检查这些表中的每一个。这会很慢。

    解决方案是有一个文件表,以及一个与他们共享文件的人的表。在第二张表上,每个文件和共享对象将有一行(即,如果一个文件与 3 个人共享,则该文件在该表上将有 3 行)。

    如下所示。

    文件表。每个文件一行

    --
    -- Table structure for table `filestable`
    --
    
    CREATE TABLE IF NOT EXISTS `filestable` (
      `FileId` int(11) NOT NULL AUTO_INCREMENT,
      `FileName` varchar(255) NOT NULL,
      `Owner` int(11) NOT NULL,
      `FilePath` varchar(255) NOT NULL,
      PRIMARY KEY (`FileId`),
      KEY `Owner` (`Owner`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    

    用户表。每个用户一行

    --
    -- Table structure for table `filesusers`
    --
    
    CREATE TABLE IF NOT EXISTS `filesusers` (
      `UserId` int(11) NOT NULL AUTO_INCREMENT,
      `UserName` varchar(255) NOT NULL,
      PRIMARY KEY (`UserId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    

    文件共享表。每个文件将在此处具有一对多行,每个用户也将如此。用户有权访问的每个文件 2 将有一行

    --
    -- Table structure for table `filesshares`
    --
    
    CREATE TABLE IF NOT EXISTS `filesshares` (
      `Id` int(11) NOT NULL AUTO_INCREMENT,
      `FileId` int(11) NOT NULL,
      `UserId` int(11) NOT NULL,
      PRIMARY KEY (`Id`),
      KEY `FileId` (`FileId`),
      KEY `UserId` (`UserId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    

    通过这种方式,您可以轻松地加入表格以查找用户有权访问的任何文件,或文件可以被访问的任何用户。

    【讨论】:

    • 如果我没记错的话,你的意思是像 file_details table-id,owner,name,date et c and file_shared id, filename, shared-with。赖特?
    • 编辑添加了一些简单的建议表格布局
    • 现在我假设我有 1000 个用户和 1000 个文件。根据示例,如果我没有理解错,fileshares 表中的行数将为 1000*1000。这是10,00,000。所以这不是问题吗?随着人数的增加会好起来吗?
    • 不,不是问题。 MySQL 会愉快地处理这个问题(而且规模更大)。与您的解决方案相比,第一个解决方案可能需要 shared_with 列是 TEXT 类型列(每行可能占用 10k),而您的第二个解决方案需要 1000 个用户表。
    【解决方案2】:

    没有选择

    您已经有一个文件表和一个用户表。因此,您添加了一个包含 2 列 FileID、UserID 的文件/用户表

    每一列都是相应表的外键。两者共同构成主键。

    您可以添加其他列来跟踪下载或日期时间戳等

    【讨论】:

    • 这意味着每个用户赖特的每个表?如果用户数量增加,现在是否会成为问题?
    猜你喜欢
    • 2013-01-25
    • 2016-05-10
    • 2012-11-25
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多