我有一个文件共享应用。我没有在DB中存储文件。它就在文件夹中。这些是用户上传的文件。 现在每个文件可以与多个用户共享,例如1个文件与千人共享。 我想以最简单的方式实现这一点并且还要记住性能。现在我有两个选择。
1)包含id,所有者,文件名,文件路径,shared_with (由','。示例user1,user2,user3分配的值),日期等列的表。
2)每个用户的表格,其中包含column-id,owner,filename,file-path。
我认为1选项更可取,但要了解与特定用户共享多少文件很困难。无论如何,我问因为可能有更好的答案谢谢我想选择这些选项。 谢谢和问候
答案 0 :(得分: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 ;
通过这种方式,您可以轻松地加入表格以查找用户有权访问的任何文件,或者可以访问任何文件的用户。
答案 1 :(得分:1)
这两个选项
您已拥有文件表和用户表。因此,您添加一个文件/用户表,其中包含2列FileID,UserID
每列是各个表的外键。两者一起形成主键。
您可以添加其他列来跟踪下载或日期时间戳等