【问题标题】:Table with 2 fields but only one can be used at a time表有 2 个字段,但一次只能使用一个
【发布时间】:2016-02-21 18:02:42
【问题描述】:

您将如何设计一个具有 2 个字段的表的数据库,并且一次只能设置一个字段,而没有太多冗余?例如文件系统:

假设我们有一个包含驱动器的表,一个包含文件夹,一个包含文件。

驱动器和文件非常简单。但是,文件夹的父级可以是文件夹(在这种情况下引用同一个表)或磁盘(在这种情况下引用到磁盘行)。

你会添加一些额外的表格吗?

【问题讨论】:

  • 是否有机会投票、选择答案并结束问题?

标签: database database-design


【解决方案1】:

一个带有 id、name、parentid 和(如果需要)类型的表。文件夹和文件都以 parentid 指向它们的父级。磁盘没有 parentid。唯一为 NULL 的字段是(相对较少的)磁盘类型记录的 parentid 字段。

【讨论】:

  • @Larry。那就是“数据库设计”?
  • @Larry。不管那是什么意思,并不打算变得“刻薄”。你需要阅读文献。如果列是迁移的元素,作为键的一部分(父 PK 用于形成子 PK)它不是“非规范化”。
  • @Larry:这听起来像是一个孩子会使用的词,我只是在猜测它的意思。你希望谷歌搜索知识?罗特夫。想像都没用,买一本教科书读一读。我会修复我的“设计”。这里的 cmets 是您的“设计”。
  • 我很高兴收到比我有更好解决方案的人的礼貌纠正。我什至可以接受一个粗鲁的回答来教会我一些东西。但是你既粗鲁又错误,从来都不是一个好的组合。我看到你已经删除了你的答案,这至少有助于不误导原始海报。是的,我希望在 google 上找到对任何计算机主题的引用。
  • @Larry:我向 SO 提供服务的方式是删除答案,直到我纠正它(已经很晚了);现在已经完成了。如果有任何具体的错误,请指出。 SO 受到那些在网络上获得可悲肤浅信息的人提供的可悲肤浅答案的困扰;没有实际教育和经验的人。教育和专业人士花钱是有原因的。回到我最初的评论:你还没有“设计”数据库,或者回答了数据库设计问题;三个表,因为它们还没有被建模。
【解决方案2】:

小错误已于 2010 年 11 月 26 日更正

我不明白你为什么需要三个文件(它们不是数据库中的“表”,直到它们一起被规范化)。

如果您实际处理的内容是驱动器;文件夹;文件,那么它们都是文件。这导致了著名的目录树问题,该问题在 Unix I-Nodes 中得到了解决,但在任何 MS 文件系统上仍然存在问题。

  • 最高级别的节点具有“X:”(驱动器)形式的文件名

    • 它们没有父节点

    • 使用 CHAR(0) 代替 Null(这是一种替代方法,消除了数据库中 Null 的问题,从而消除了性能问题;它没有解决 Null 问题,因为驱动器没有父级。您仍然需要代码)。
      .

  • 不是两个或三个具有大量数据重复和更新异常的独立且不同的文件(您确实要求提供数据库设计的答案,对吗?)。这不是微不足道的。

  • 不要盲目地将 Id-iot “关键”列粘贴在所有移动的东西上。

  • 如果IsFolder,则Node是目录树中的一个分支,一个Folder;否则它是一个文件。

  • 可以将文件提升为文件夹:将“IsFolder”设置为 true;然后可以用作ParentNode。如果您有 ISO/IEC/ANSI 标准 SQL,则可以实现 CHECK 约束以确保 ParentNodes 是 IsFolder

  • 如果行不是IsFolder,一个文件,它不能用作文件夹或ParentNode。

  • 文件名在节点(文件夹)中必须是唯一的,因此提供了唯一索引。 AK 是备用键的标准表示法,表示唯一索引。

Directory Data Model http://www.softwaregems.com.au/Documents/Student%20Resolutions/Andrew%20DM.pdf

▶Link to IDEF1X Notation◀ 面向不熟悉关系建模标准的读者。

回复评论

  1. 一些评论者认为此模型中存在“重复”或 FileName 是串联的。这显然是由于无法读取以标准表示法提供的模型。或者无法识别高度标准化的结构。

    • 没有任何形式的重复

    • 文件名是原子的,例如 CHAR(30),而不是整个路径或 URL。

    • 原子表示文件名未连接

    • 文件名在节点内不重复。如果在另一个Node中使用相同的FileName,那不是重复,那是现实,这是允许的。

    • 实际上,高度归一化的结构非常小且简洁。

  2. 我会要求任何难以理解此模型的人发布一个具体问题,而不是就他们不知道的主题发表声明。

  3. 同样要求任何认为自己发现此模型“问题”的人表现得像技术人员一样,并发布他们认为自己发现的特定错误,而不是发表概括性和个人意见。

【讨论】:

  • 您不能将文件名用作 PK,它在文件夹之间不是唯一的。为了使其唯一,您需要使文件名成为完全限定的路径,这违反了两个规范化规则 - 两个属性(父级和文件名)存储在单个列中和数据重复(父级存储在文件名和父字段中)。此外,您最终会得到一些非常非常长的键值。最后,除非您打算存储符号“。”和“..”链接、文件夹和驱动器可以是空的,因此与架构中的文件无法区分。
  • @Larry:已更正了跨文件夹的文件名唯一性错误。文件名中没有点。我为无法获取数据的人添加了IsFolder。您的 cmets 重新“标准化”根本不正确;寻求者可能对它有更好的理解。随意提出具体的问题(而不是笼统地指责)。
  • 这并不比你最初的尝试好。您只是将问题从一个领域推到了另一个领域。这种“设计”包含两个缺陷之一——要么将整个路径存储在 Parent 字段中(在这种情况下,数据被严重非规范化),要么你只在那里存储文件夹/驱动器名称,在这种情况下值不是唯一的,它们不可能作为返回父记录的标识键。
  • @Larry。您在阅读和理解标准数据模型时遇到问题。请点击第二个链接并熟悉标准。 1) 我已经发布了 FileName not 连接,它是原子的。 2)呃,FK是Parent**Node**,没有ParentFileName。 3) 如前所述,根据 Unix inode,Node 是一个整数。 4)根据我的最后一段,有第二个索引。 5) 随意提出具体问题(而不是发表不正确的意见),你会减少自己的尴尬。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多