【发布时间】:2016-02-21 18:02:42
【问题描述】:
您将如何设计一个具有 2 个字段的表的数据库,并且一次只能设置一个字段,而没有太多冗余?例如文件系统:
假设我们有一个包含驱动器的表,一个包含文件夹,一个包含文件。
驱动器和文件非常简单。但是,文件夹的父级可以是文件夹(在这种情况下引用同一个表)或磁盘(在这种情况下引用到磁盘行)。
你会添加一些额外的表格吗?
【问题讨论】:
-
是否有机会投票、选择答案并结束问题?
您将如何设计一个具有 2 个字段的表的数据库,并且一次只能设置一个字段,而没有太多冗余?例如文件系统:
假设我们有一个包含驱动器的表,一个包含文件夹,一个包含文件。
驱动器和文件非常简单。但是,文件夹的父级可以是文件夹(在这种情况下引用同一个表)或磁盘(在这种情况下引用到磁盘行)。
你会添加一些额外的表格吗?
【问题讨论】:
一个带有 id、name、parentid 和(如果需要)类型的表。文件夹和文件都以 parentid 指向它们的父级。磁盘没有 parentid。唯一为 NULL 的字段是(相对较少的)磁盘类型记录的 parentid 字段。
【讨论】:
小错误已于 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◀ 面向不熟悉关系建模标准的读者。
一些评论者认为此模型中存在“重复”或 FileName 是串联的。这显然是由于无法读取以标准表示法提供的模型。或者无法识别高度标准化的结构。
没有任何形式的重复
文件名是原子的,例如 CHAR(30),而不是整个路径或 URL。
原子表示文件名未连接
文件名在节点内不重复。如果在另一个Node中使用相同的FileName,那不是重复,那是现实,这是允许的。
实际上,高度归一化的结构非常小且简洁。
我会要求任何难以理解此模型的人发布一个具体问题,而不是就他们不知道的主题发表声明。
同样要求任何认为自己发现此模型“问题”的人表现得像技术人员一样,并发布他们认为自己发现的特定错误,而不是发表概括性和个人意见。
【讨论】:
IsFolder。您的 cmets 重新“标准化”根本不正确;寻求者可能对它有更好的理解。随意提出具体的问题(而不是笼统地指责)。
Parent**Node**,没有ParentFileName。 3) 如前所述,根据 Unix inode,Node 是一个整数。 4)根据我的最后一段,有第二个索引。 5) 随意提出具体问题(而不是发表不正确的意见),你会减少自己的尴尬。