您的两个解决方案都有问题。
使用第一个选项,您将使用逗号分隔的用户字段来共享文件。有了这个,几乎不可能有效地搜索用户共享的文件。
使用第二个,您将获得大量桌子。如果您想知道与您共享文件的所有用户,则需要检查这些表中的每一个。这会很慢。
解决方案是有一个文件表,以及谁与他们共享文件的表。在第二张表上,每个文件和共享对象将有一行(即,如果一个文件与 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 ;
通过这种方式,您可以轻松地连接表以查找用户有权访问的任何文件,或文件可以访问的任何用户。