什么是更好的,许多重复的行或增加表?

时间:2013-04-24 08:26:32

标签: mysql hibernate database-design

我有一个文件共享应用。我没有在DB中存储文件。它就在文件夹中。这些是用户上传的文件。 现在每个文件可以与多个用户共享,例如1个文件与千人共享。 我想以最简单的方式实现这一点并且还要记住性能。现在我有两个选择。

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

2)每个用户的表格,其中包含column-id,owner,filename,file-path。

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

2 个答案:

答案 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

每列是各个表的外键。两者一起形成主键。

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