如果字段名称暗示关系,是否为父/子关系?

ple*_* me 0 mysql relational-theory

我正在使用协调系统并尝试在 MySQL 数据库中对其进行编目。这例如像这样工作

01  LIVE ANIMALS
0101  horses, asses, mules and hinnies, live
0102  bovine animals, live
0103  swine, live
010310  Purebred breeding animals
010391  Weighing less than 50 (11023 lb) each
010392  Weighing 50 (11023 lb) or more each
0104  sheep and goats, live
0105  chickens, ducks, geese, turkeys, and guineas, live
0106  animals, live, nesoi Nesoi - not elsewhere specified of indicated.
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,有一个明确的父子关系。这种关系总是可以通过所使用的编号来追溯。从这个线程我了解到我最好使用文本数据字段作为代码(01、0101 等)。我的问题是:我应该在某处记录亲子关系,还是没有必要?毕竟,我可以做到:

SELECT * FROM accounts WHERE code LIKE '0103%'
Run Code Online (Sandbox Code Playgroud)

并获得所有子帐户就好了。而且我觉得父子表可能会使事情变得更复杂。但我想听听其他人的看法。

Len*_*art 5

您所描述的是“物化路径”的变体,例如参见https://communities.bmc.com/docs/DOC-9902的示例。我说变体是因为您没有分隔符标记,而是为每个不同级别使用固定数量的位置。

在实体化路径中,您通常没有表示明确的父/子关系,而是将其编码到“路径”字符串中。要确定子类别,请在您的示例中使用 like。对于祖先类别,您需要一些拆分路径字符串的程序部分。直系父母是第一个祖先。可以使用 like 和 length() 函数的组合来定位直接子级。根和叶谓词也很容易定义。

作为起点,为什么要添加父子关系(如果不是为了上述操作)?如果答案是参照完整性,它会有点落后,因为您手头已经有了域(您现有的表)。添加一个单独的关系(表)来表示父/子关系将类似于:

create table ... 
( category varchar(...) not null
,     constraint ... 
          foreign key ... references ...
, parent_category varchar(...) not null 
,     constraint ... 
          foreign key ... references ...
)
Run Code Online (Sandbox Code Playgroud)

您可以在插入新的“类别”后让触发器填充此表,
但它并不能真正保护您免受任何伤害,它更像是您编码的父子关系的报告。

另一种选择是向现有表添加一个可为空的属性,您的“顶级类别”将 null 作为父级,而其他的将substr(code, 1, length(code)-2)作为父级。这将是“邻接列表”和“物化路径”之间的某种混合。您仍然需要防止异常,如 ('01020304', NULL) 和 ('010203','0202')。可以添加验证这一点的触发器。

如果您想保持当前表的原样,添加验证代码可能是最简单的,无论是在触发器中还是在您的应用程序中,以确保存在“超级类别”。

如果您愿意将代码分成几部分,您可以查看“嵌套集”。它在我上面给出的链接中进行了描述,或者作为附加的传递闭包关系,例如参见http://karwin.blogspot.se/2009/04/sql-antipatterns-strike-back-slides.html。在http://dustbite.se/tree/ 中描述了相同方法的轻微变化 。“Nested Set”和“Transitive Closure”都会为您可能最常见的操作增加大量开销

就我个人而言,我会坚持使用您拥有的内容并添加验证触发器,以检查在修改“树”期间代码是否一致

由于在@Vérace 帖子中提到 Oracle XE 作为替代 DBMS,我只是指出其他商业供应商也提供免费版本。请参阅 Microsoft SQL Server 2014 Express ( http://msdn.microsoft.com/en-us/evalcenter/dn434042.aspx ) 和 DB2 Express-C ( http://www-01.ibm.com/software/data/db2 /express-c/download.html)。DB2没有Oracle那样的空间限制,我不熟悉SQL-server的限制。