问题标签 [hierarchical-data]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql - 如何在没有这些子类别的情况下检索子类别?
这是我的声明:
它工作得很好,但我想修改它以仅获取所选类别(此处为“产品”)旁边的第一个节点,而没有子类别的子类别
喜欢:产品:
A型
亚型A
亚型B
B型
我想得到'TypeA','TypeB'。
顺便说一下,这是我的桌子:
mysql - 从 MySQL 的菜单表中获取一致的菜单树数据
我有一个无法解决的树/祖先/查询问题:
我有一个包含菜单数据的表和一个包含菜单所有祖先的表:
我通过以下方式轻松获得所有活动菜单条目及其祖先:
但是我怎样才能得到所有的树必要的祖先呢?在我的结果中,我需要条目 Foo 和 News 以便获得一致的树。它应该如下所示:
查询如何?
database - 数据库设计/延迟/并发,非常头疼
我有一个客户端-服务器应用程序,它从几个表中获取所有数据,重新计算并存储它。
例子:
每个项目都有一个“材料清单”= 其他项目的清单和数量。因此,一个项目的成本是其 BOM 中项目的成本 * 它们的数量之和。最终,一些“基础”项目没有 BOM,只是独立设置成本。(即:原材料)
即:A 的 BOM 说它由 2xB 和 3xC 制成。
我现在所做的,我不记得我为什么这样做,是我从数据库中获取所有项目和所有 BOM,并一次针对每个项目递归计算其成本。一旦我计算了一个项目,我就会标记它,这样我就不会再重做成本了。(也防止无限递归)
事情是,这有点愚蠢:首先,它很慢并且会重新计算没有改变的东西,更糟糕的是,给它一个足够大的数据库,它会耗尽内存。
相反,我可以按需重新计算项目:当一个项目的 BOM 发生变化时,我重新计算该 BOM,然后选择包含此更新项目的所有 BOM,并重新计算它们;冲洗并递归重复,直到到达顶部,数据库中没有 BOM 依赖于任何更改的项目。
这在实践中意味着什么:假设一些项目是原材料,其成本可能会经常更新,而一些项目是“最终用户”的东西,它们的 BOM 很少会改变。当用户更改其中一种材料的成本时,可能意味着要处理数千个项目,重新计算它们。假设 1 个项目/BOM 的 SELECT 需要 15 毫秒(我在 Postgresql 上),然后仅 SELECTing 1000 个项目/BOM 将需要 15 秒,然后您必须将重新计算的成本更新回数据库中的项目......哦亲爱的,延迟现在可以变成几分钟。
我工作的公司使用的 ERP 软件采用第一种方法:一次批量重新计算整个数据库。从字面上看,这需要几个小时,而且在 10 多年的使用中,这种方法似乎已经出现了问题。批量重新计算每周进行一次。
既然我实际上已经“大声写出来”,我认为几分钟的时间并不重要。问题是我不太了解数据库,而且我担心并发性:由于在项目 A 上更新需要很长时间,因此很可能有人会在项目 A 正在更新期间更新第二个项目 B更新。
假设 D 项是由上面的 A 和 B 组成的。用户 1 更新 A,因此服务器软件开始与数据库自慰几分钟,最终更新 D。但与此同时,用户 2 更新 B,因此服务器最终将再次更新 D。
使用 Postgresql 的事务会解决问题吗?事务从数据库的当前状态开始,因此事务 1 看到 D 由 A1 和 B1 组成,并将 A 从 A1 更新到 A2,但在它完成并提交之前,事务 2 将开始,也看到 A1和 B1。T1 重新计算并提交,D = A2 + B1。但是T2已经开始了,并没有看到新的A,A2。因此,它最终将 D = A1 + B2 提交给 DB,这是不正确的。它应该是 D = A2 + B2。
此外,一些处理会重叠,浪费服务器时间。
如果我按顺序而不是并行执行 T1 和 T2,那么万岁,答案是正确的,但用户 2 将不得不等待更长时间。此外,如果一组事务彼此没有关系(完全独立的......依赖树;即:A=X+Y 和 B=N+M),那么并行计算将给出正确的答案并且对于用户。
重要提示:即使按顺序处理,我仍然会使用事务,因此软件的其余部分仍然可以并行处理该数据,除了重新计算成本的功能。
现在,如果……数据库延迟不会那么“糟糕”,那么整个“按顺序处理”的事情就不会那么糟糕了。比如说,如果整个数据都保存在 RAM 中,那么处理 1000 个对象将是轻而易举的事。啊,但是即使我构建了一个系统来快速将大块数据移入/移出磁盘/RAM并进行一些缓存 - 以替换 DB - ,那也行不通,因为我仍然需要事务,以便服务器的其余功能可以并行工作。(上面的“重要说明”)所以我最终会建立另一个数据库。可能会快一点,但它愚蠢/浪费时间。
我“缓存”每个项目的成本的全部原因是我每次使用它时都不会重新计算它,因为它不仅浪费了有限的资源,而且数据库延迟太大而且并发问题的规模更大。
现在我不需要奇怪为什么“他们”会大批量这样做……这让我很头疼。
Q1:你们如何以“最佳”方式解决这个问题?
根据我目前的理解(即在遇到之前我默默忽略的并发问题之后),我会让那个函数按顺序使用事务,而应用程序的其余部分仍然可以并行使用数据,我相信最适合用户。这就是目标:对用户最好,但保证系统的正确性。
也许稍后我可以向它扔硬件并使用软件黑魔法来减少延迟,但我现在开始对自己撒谎。
另外,在过去的几个月里,我对一些显而易见的事情完全视而不见(有些与编程无关),所以我期待有人会指出一些我设法错过的可耻的明显事情......: |
regex - 正则表达式问题:上下文匹配
我有一个带有分层文本的结构化文件,它描述了 Delphi 中的 GUI(一个 DFM 文件)。
假设我有这个文件,我必须匹配 TmyButton(标记)上下文中的所有“Color = xxx”行,而不是其他上下文中的那些。在 TMyButton-Context 内不会有更深的层次结构。
我试了两天,做了很多很多不同的尝试。这是我的一些不完整的模式:
(我不知道为什么,但我不得不使用“\r\n”而不是“$”......)。我需要把它放在一起,但忽略除其他“object xxx:yyy”和“end”行之外的其他行......
我很高兴能得到一些帮助!
sql - 生成存储在 MySQL 中的类别的面包屑
在 MySQL 中,我以这种方式存储类别:
类别: - category_id - category_name - parent_category_id
为给定的 category_id 生成跟踪/面包屑的最有效方法是什么?
例如面包屑(category_id):General > Sub 1 > Sub 2
理论上可能有无限的层次。我正在使用 php。
更新:我看到了这篇关于嵌套集模型的文章 ( http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ )。看起来很有趣,但是您以前会如何动态管理类别?它在纸上看起来更容易,比如当您提前知道类别时,但当用户可以即时创建/删除/编辑类别时则不然……您怎么看?
sql - SQL Server 2005 中的分层查询
我在 SQL Server 2005 中的表中有一个数据结构,表示一系列相关对象。每个对象都可以在许多步骤中进行替换。我想执行一个查询,返回替换链中的所有对象和每个对象的叶子。
数据:
结果应该是:
我相信递归 CTE 将是一个很好的方法,但我无法绕过它。问题的一个限制是我无法更改数据结构,因为数据库不在我的控制范围内。
asp-classic - 在经典 ASP 中管理数组或数组的最佳方法是什么
PHP 提供了关联数组,但在经典的 asp 中没有这样的东西。我正在寻找一个允许我创建和遍历与此类似的层次结构的类或函数:
正如您所注意到的,层次结构的深度不均匀——它可能是 3、4 或 5 级深度。数据库结构更加复杂,对于某些记录,我必须从区域级别开始显示数据,而对于其他记录,我应该从国家/地区开始。数组数组确实会有所帮助,但在 ASP 中我的双手被束缚了。
c# - 尝试使用 linq 基于具有分层数据的表进行搜索
我有一个名为 Types 的表,其中包含以下列。
ID 级别名称 ParentID(父行的 ID)
和一个名为 ParentObject 的表,其中包含以下列。ID类型ID
有4个不同的级别(可能会扩展到更多)。
所以如果我有
ID:1 级别:0 名称:Level0 ParentID:空
ID:2 级别:1 名称:Level1 ParentID:1
ID:3 级别:2 名称:Level2 ParentID:2
ID:4 级别:3 名称:Level3 ParentID:3
ID:5 级别:4 名称:Level4 ParentID:4
在 ParentObject 表中,我仅通过存储最低级别的 ID 来存储树。所以如果我的 ID 是 4,我知道树实际上是 Level0 -> Level1 -> Level2 -> Level3
基本上,我需要能够在所有对象中搜索特定类型或类型级别 2,例如在 linq 语句中。
假设ParentObject表中存储的TypeID是4,所以Level3。
但我实际上想搜索 Level 2 类型 ID 为 3 的所有 ParentObjects。
由于存储的 id 可能是 level1 或 level2 等,最好的方法是什么?
如果可能的话,最好在一个 linq 语句中。
php - 如何获取一个类别及其子类别(和子子类别)中所有产品的计数?
类别表如下所示:
关系表:
我可以轻松轻松地检索任何一个类别及其直接子类别中的产品数量。但是,如果有超过 2 个级别,事情就会变得一团糟。
所以我的问题是如何获得男士及其子类别中所有产品的数量。还是衬衫及其子类别?
任何想法,谢谢。
更新:
我知道有嵌套集模型,但我现在无法将结构更改为那个。
sql - 确定 SQL 数据库中记录的层次结构
我有一个问题,我想知道是否有一个优雅的解决方案。这是一个真正的商业问题,而不是课堂作业!
我有一张包含数千条记录的表,其中一些是彼此相关的组。
数据库是 SQL 2005。
ID 是主键。如果记录替换了较早的记录,则该记录的 ID 位于 REP_ID 列中。
所以在这个例子中,A 是原始行,B 替换 A,C 替换 B 失败,D 替换 B 成功,最后 E 替换 D。
我希望能够在网格中显示此表中的所有记录。然后,我希望用户能够右键单击任何组中的任何记录,并让系统找到所有相关记录并将它们显示在某种树中。
现在我显然可以强力解决这个问题,但我想问问社区他们是否能看到更优雅的答案。