1

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

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

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

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

4

2 回答 2

2

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

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

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

解决方案是有一个文件表,以及谁与他们共享文件的表。在第二张表上,每个文件和共享对象将有一行(即,如果一个文件与 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 ;

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

于 2013-04-24T09:27:49.917 回答
1

两个选项都没有

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

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

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

于 2013-04-24T08:27:37.520 回答