Database 数据库模式:如何设计用户、文件和文件夹之间的关系?

Database 数据库模式:如何设计用户、文件和文件夹之间的关系?,database,database-design,database-schema,Database,Database Design,Database Schema,我想知道Dropbox的数据库模式将如何设计?我考虑的是三个表:用户表、文件表、文件夹表,并有以下约束 限制条件: 一个用户可以包含多个文件和文件夹 每个文件可以在多个用户之间共享 文件可以为一个用户组织在文件夹中,但不能为另一个用户组织(如果文件是共享的) 每个文件夹可以包含多个文件以及其他文件夹 如何在他们之间建立关系?此ERD符合您描述的规则: 请注意,在此模式中,每个用户都有自己的个性化文件夹视图。另一方面,文件仅表示一次,但可以分配给一个或多个文件夹,即使是针对不同的用户 编辑:(

我想知道Dropbox的数据库模式将如何设计?我考虑的是三个表:用户表、文件表、文件夹表,并有以下约束

限制条件:

  • 一个用户可以包含多个文件和文件夹
  • 每个文件可以在多个用户之间共享
  • 文件可以为一个用户组织在文件夹中,但不能为另一个用户组织(如果文件是共享的)
  • 每个文件夹可以包含多个文件以及其他文件夹

  • 如何在他们之间建立关系?

    此ERD符合您描述的规则:

    请注意,在此模式中,每个用户都有自己的个性化文件夹视图。另一方面,文件仅表示一次,但可以分配给一个或多个文件夹,即使是针对不同的用户


    编辑:(略)扩展模型:

    通过添加一个表来跟踪物理文件夹及其内容,我建议的模式还解决了Branko Dimitrijevic建议的所有附加功能:

    这是一个好的开始,但让我用另一种可能性来激发你的想象力:

    此模型具有以下属性:

    • 它模拟文件系统硬链接。您可以将一个文件放在多个文件夹中,甚至可以在同一个文件夹中多次放在不同名称下。文件夹也是如此
    • 它将命名与内容分离,这是“硬链接”范例所必需的。因此,名称在文件夹中的文件和文件夹中(而不是在文件和文件夹中)
    • 它正确地强制“本地”名称的唯一性(在同一父文件夹下,不能有两个文件或文件夹以相同的方式命名)
    • 用户既不拥有文件也不拥有文件夹。用户只拥有链接。这样,每个用户都有自己的私有“目录树”,可能共享所有文件,或者不共享任何文件,或者两者之间的任何文件

    当然,问题是,这个模型增加的灵活性是否值得额外的复杂性,但这是只有您才能回答的问题…

    1)创建一个包含用户id、文件id、文件夹id作为fk的连接表。文件id和文件夹id可以为空。这样我们就可以找到用户的所有文件,以及它们是否包含在任何文件夹中。此外,还可以找到给定文件夹(用户的)的所有文件。2)由于文件夹本身具有一对多关系,因此我们可以使用folder_id列创建文件夹表,该列将是代表其父文件夹pk的fk。感谢您的建议。我在MSSQL服务器中尝试了此模式的基本实现。老实说,理解您的设计以及它如何符合所有约束条件在智力上是非常有启发性的。但有一个疑问:“用户既不拥有文件也不拥有文件夹。”如果我们想知道文件的所有者是谁呢?考虑到我们可以允许其他共享用户使用一些访问规则。如何区分用户和其他共享用户?我的想法是在文件(以及文件夹)表中创建一个所有者id作为fk,它在文件和用户之间创建一对多关系。@Agent47DarkSoul是的,您当然可以在文件和用户之间创建一个fk,以将其中一个用户标记为“特殊”(即文件所有者)。问题是,你真的需要这个吗?即,共享同一文件的所有用户是否应受到平等对待?再说一遍,只有你能回答这个问题…谢谢你把它弄清楚了。我认为它基本上完成了约束。这听起来可能是一个奇怪的要求,但你能帮我理解乔尔的设计,以及它与你的设计有什么不同吗。也有一些疑问。你能帮我清理一下吗?再次感谢所有的学习经验。我也使用这个模式,我有一个问题:考虑下面的结构:文件夹>子文件夹>子文件夹。因此,当我想与其他用户共享整个文件夹时,我必须复制所有3个“folder\u in\u folder”行并将它们分配给其他用户,对吗?@Manu是的,在此模式中,用户必须明确拥有所需的(子)链接集,每个链接集由单独的行表示。感谢您的输入。对不起,但我似乎有一个疑问,我无法摆脱我的头脑。如果一个文件不存在于任何文件夹中,而是直接存在于根级别,该怎么办。那么,我们如何理解该文件是为哪个用户存在的呢?如果我错过了什么,我会提前道歉。另外,如果您能详细说明该图,我们将不胜感激。对于该模式还有一些疑问:1)为什么我们需要物理文件夹的自1-M关系,因为可以使用虚拟文件夹(我的意思是,这是整个连接点表)导出自1-M关系?2) 为什么物理文件和物理文件夹之间需要1-M关系?@Agent47DarkSoul第一个设计很好,也很简单,可能正是您所需要的。本质上,每个用户都有自己的私有文件夹树,但是文件可以由多个文件夹共享(因此不止一个用户)。@ AgTeNe4DARKYOLL(关于第一个设计),考虑逆转文件夹和用户之间的连接的“定向”,以避免在同一文件夹树中“混合”不同的用户。这样,只有一个(“根”)文件夹连接到用户,通过递归查找根文件夹可以确定所有权。最初的设计并不是不正确的,我们只是在讨论不同的权衡:易于查询与易于更新和存储节省。坦白地说,我可能会使用原始设计,但会检查约束以确保没有用户混合。@Agent47DarkSoul至于第二个设计,我不太确定我是否理解;)它似乎有点太“开放”和“松散”,所以也许乔尔·布朗可以评论一下?