在查询数据库以查找嵌套在闭包表中的注释之后,比如Bill Karwin在这里建议什么是将平面表解析为树的最有效/优雅的方法?,我现在从SQL获得以下数据结构:
"comments": [
{
"id": "1",
"breadcrumbs": "1",
"body": "Bell pepper melon mung."
},
{
"id": "2",
"breadcrumbs": "1,2",
"body": "Pea sprouts green bean."
},
{
"id": "3",
"breadcrumbs": "1,3",
"body": "Komatsuna plantain spinach sorrel."
},
{
"id": "4",
"breadcrumbs": "1,2,4",
"body": "Rock melon grape parsnip."
},
{
"id": "5",
"breadcrumbs": "5",
"body": "Ricebean spring onion grape."
},
{
"id": "6",
"breadcrumbs": "5,6",
"body": "Chestnut kohlrabi parsnip daikon."
}
]
Run Code Online (Sandbox Code Playgroud)
使用PHP我想重构这个数据集,所以注释嵌套如下:
"comments": [
{
"id": "1",
"breadcrumbs": …Run Code Online (Sandbox Code Playgroud) 我试图设计一个数据结构,以便于快速查询(删除,插入更新速度对我来说并不重要).
问题:传递关系,一个条目可以通过其他条目建立关系,其关系我不想为每种可能性单独保存.
意味着 - >我知道Entry-A与Entry-B有关,并且知道Entry-B与Entry-C有关,即使我不明确知道Entry-A与Entry-C有关,I想查询它.
我认为解决方案是:
插入,删除或更新时消除传递部分.
Entry:
id
representative_id
Run Code Online (Sandbox Code Playgroud)
我会将它们存储为集合,例如条目组(不是mysql集类型,数学集,对不起,如果我的英语错误).每个集合都有一个代表性条目,所有集合元素都与代表性元素相关.
新插入将插入Entry并将代表设置为自身.

如果新插入的条目应该连接到另一个,我只需将新插入的条目的代表ID设置为引用条目的rep.id.
将B附加到A.

没关系,如果我需要将它连接到不是代表性条目的东西,它将是相同的,因为集合中的每个条目都具有相同的rep.id.
将C附加到B

分离BC:分离的项目将成为代表性条目,这意味着它将与自身相关.
拆分BC并将C连接到X.

删除:如果我删除了非代表性条目,则可以自我解释.但删除rep.entry有点困难.我需要为集合选择一个新的rep.entry,并将每个集成员的rep.id设置为新的rep.entry的rep.id.
所以,删除A:

结果如下:

你怎么看待这件事?这是一种正确的方法吗?我错过了什么吗?我应该改进什么?
编辑:查询:所以,如果我想查询与某个条目相关的每个条目,其id我知道:
SELECT*FROM条目LEFT JOIN条目b ON(a.rep_id = b.rep_id)WHERE a.id =:id
SELECT * FROM AlkReferencia
WHERE rep_id=(SELECT rep_id FROM AlkReferencia
WHERE id=:id);
Run Code Online (Sandbox Code Playgroud)
关于需要这个的应用程序:
基本上,我存储车辆部件号(参考),一个制造商可以制造多个部件,可以替换另一个,另一个制造商可以制造替换其他制造商部件的部件.
参考:一个制造商的OEM编号到某个产品.
交叉引用:制造商可以制造出旨在替换其他制造商的产品的产品.
我必须以某种方式连接这些引用,当客户搜索数字时(无论他有什么类型的数字)我可以列出确切的结果和替代产品.
要使用上面的示例(最后一张图片):B,D和E是我们可能存储的不同产品.每个人都有一个制造商和一个字符串名称/参考(我之前称之为数字,但它几乎可以是任何字符链).如果我搜索B的参考编号,我应该返回B作为精确结果,D,E作为替代.
到现在为止还挺好.但我需要上传这些参考号码.我不能只是从ALL-IN-ONE数据库迁移它们.大多数时候,当我上传我从制造商处获得的参考资料时(不知何故,大部分时间都来自手工,但我也可以使用目录),我只得到一个列表,制造商告诉哪些其他参考编号指向他的编号.
例.:
Asas过滤器制造商,"AS 1"过滤器有这些交叉引用(意味着,替换这些):
GOLDEN SUPER --> 1
ALFA ROMEO --> 101000603000
ALFA ROMEO --> 105000603007
ALFA ROMEO --> 1050006040
RENAULT TRUCKS (RVI) --> 122577600
RENAULT TRUCKS (RVI) --> 1225961
ALFA ROMEO --> …Run Code Online (Sandbox Code Playgroud) 我正在开发一个桌面应用程序,它很像WinDirStat或voidtools'Everything - 它映射硬盘驱动器,即从目录树中创建一个深层嵌套的字典.
然后,桌面应用程序应将目录树存储在某种数据库中,以便可以使用Web应用程序从根目录深度级别浏览它们.
假设两个应用程序暂时在同一台机器上本地运行.
我想到的问题是如何构建数据以及应该使用什么数据库,考虑:1)RAM消耗应该合理2)准备好在Web应用程序中查看目录所需的时间应该是最小
PS - 我的初始方法是将每个文件系统节点分别序列化为JSON并将每个节点插入到Mongo中,并将对象引用链接到它们的子节点.这样,Web应用程序可以根据用户需求轻松加载数据.但是,我担心为Mongo制作这么多(平均一百万个)独立插件需要花费很多时间; 如果我进行批量插入,这意味着我必须将每个批量保留在内存中.
我还考虑将整个树转储为一个深度嵌套的JSON,但数据太大而不能成为Mongo文档.GridFS可以用来存储它,但是我会在web应用程序中加载整个树,即使深层节点可能不感兴趣.
想象我有这个名为Department的表.每个部门都可以有子部门.
我想将一个名为ParentDepartmentID的列作为另一个部门的外键.如果此键为空,则表示它是父级顶级部门,而不是任何其他部门的子级.
我想你可以称之为自引用ID.SQLite支持这个吗?有外键,但也允许空值?
你会如何解决这个用例?
我有 MySQL 表结构:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`parent_id` int(10) unsigned NOT NULL DEFAULT '0',
`name` varchar(255) NOT NULL DEFAULT '',
`is_working` tinyint(1) unsigned NOT NULL DEFAULT '1',
);
Run Code Online (Sandbox Code Playgroud)
id它保存具有和关系的分层数据parent_id
我有 5 层深度树,例如:
CATEGORY LEVEL 1
SUBCAT LEVEL 2
SUBCAT LEVEL 3
SUBCAT LEVEL 4
SUBCAT LEVEL 5
Run Code Online (Sandbox Code Playgroud)
我需要(问题):如果我is_working为某个类别或子类别设置= 0,则将其所有子类别is_working设置为0 。0
我目前正在重写一个应用程序,教师可以在线计划课程.
该应用程序指导教师完成为学生创建工作单元的过程.该工具目前在三个州使用,但我们计划比这更大.
该应用程序的主要绘图卡之一是所有学生成果都预先加载到系统中.这允许教师搜索或浏览并选择在每个工作单元中将满足哪些结果.
当我最初设计系统时,我假设所有学生成绩都遵循类似的层次结构.也就是说,有名为嵌套容器,然后是结果.
我输入的原始结果是三层.因此我的数据库具有以下结构:
=========================
粗体表格
H1
id,名字
H2
id,parent___id(h1_id),名称
H3
id,parent___id(h2_id),名称
结果
id,parent___id(h3_id),名称
=========================
除了显然无法添加n /级别的层次结构之外,此方法还使得在不递归查询数据库的情况下难以显示所有标准的列表.
一旦添加了学生成绩(及其家长类别),就没有理由以任何方式对其进行修改.主要要求是它们易于阅读且高效.
到目前为止,来自不同学校/州/国家的所有学生成绩都大致遵循了我的假设.情况可能并非总是如此.
当然,所有现有数据必须从当前数据库传输.
鉴于上述情况,我存储所有不同学生成绩的最佳方式是什么?我所拥有的一些想法如下所示.
在选择使用recusion或大量连接时,继续在数据库中使用4个表
使用嵌套集
XML(所有不同集合的全局XML文件或每个集合的XML文件)
我正在制作一个referrals包含父子关系的表

我需要得到父母 - >孩子 - >儿童 - > ....
对于上表数据我想要的结果是

我已经看过SOF的一些代码,但是没有得到他们的工作方式,并且在我脑海中尝试了一个非常简单的逻辑,但不幸的是它不能用于一个奇怪的原因
我已经为它编写了存储过程,但我遇到了问题 IN CLAUSE
DELIMITER $$
DROP PROCEDURE IF EXISTS `GetHierarchy3`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `GetHierarchy3`()
BEGIN
DECLARE idss VARCHAR(225);
SET @currentParentID := 999999;
SET @lastRowCount := 0;
## A ##
INSERT INTO referrals_copy SELECT * FROM referrals WHERE uid1 = @currentParentID;
SET @lastRowCount := ROW_COUNT();
## B ##
SELECT GROUP_CONCAT(uid2) INTO @idss FROM referrals WHERE uid1 = @currentParentID;
#SELECT @lastRowCount;
SELECT * FROM referrals_copy;
WHILE @lastRowCount > 0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 3 个表连接在一起,但我一直在字段列表中收到“未知表“调用”。我知道表 'calls' 存在
这工作...
$sql = "SELECT * FROM calls WHERE id = '$diary_id'";
Run Code Online (Sandbox Code Playgroud)
但这不...
$sql = "SELECT * FROM (SELECT calls.id AS calls_id, calls.assigned_user_id AS assigned_user) calls
RIGHT JOIN accounts on accounts.parent_id = accounts.id
LEFT JOIN users on assigned_user = user.id
WHERE calls_id = '$diary_id'";
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用别名,因为我尝试加入的表具有相同的字段名称(我必须使用继承的数据库)。
任何帮助将不胜感激
我的数据库看起来像(pligg cms,示例数据)
id catID parentID catName
1 1 0 location
2 2 0 color
3 3 1 USA
4 4 3 Illinois
5 5 3 Chicago
6 6 2 Black
7 7 2 Red
Run Code Online (Sandbox Code Playgroud)
比方说,我如何获得芝加哥的顶级parentID,它应该是位置.
我在php中编写递归函数还是在mysql中可行?
正如Rob Kennedy先生所建议的那样,我已经到了需要停止将数据存储在VCL组件中并具有"基础数据结构"的地步.
首先,这个问题是关于"我如何建立基础数据结构".:)
我的层次结构由2级节点组成.
现在,我通过循环根节点来完成我的东西,其中我循环通过rootnode的子节点,以获得我需要的东西(数据).我希望能够将所有数据存储在所谓的底层数据结构中,以便我可以使用线程轻松修改条目(我想我能够做到这一点?)
但是,当循环遍历我的条目(现在)时,结果取决于节点的Checkstate - 如果我使用的是底层数据结构,我怎么知道我的节点是否被检查,当我的数据结构循环通过时,而不是我的节点?
假设我想使用2个级别.
这将是父母:
TRoot = Record
RootName : String;
RootId : Integer;
Kids : TList; //(of TKid)
End;
Run Code Online (Sandbox Code Playgroud)
那孩子:
TKid = Record
KidName : String;
KidId : Integer;
End;
Run Code Online (Sandbox Code Playgroud)
这基本上就是我现在所做的.评论说这不是最好的解决方案,所以我愿意接受建议.:)
我希望你理解我的问题.:)
谢谢!