我碰巧有一个数据库,其中包含可能包含主题,动词和补语的所有可能组合的表格。
该表看起来像一个连接表,Id列映射到我的其他表(主题表,动词表,补充表)。
在我的程序中,我使用树结构来表示联结表,因此每个节点只是一个具有Id属性的对象(subjectId或verbId ...)。
我无法理解的是将Id映射到的实际数据放在何处。我虽然有两种选择:
在第一种情况下,我唯一的处理是加载组合表并创建树。当我需要随附的数据时,我会按需加载它。但是为了跟踪树中的数据位置,数据具有指向它所属的节点的属性。(显然是为了避免必须搜索整个树(即使它只是一个O(log) n))操作)。此外,我将只处理整个程序中的一个节点,因为它是一种方便的方式来到那个节点的子节点。
在第二种情况下,如果我要将实际数据一个节点,我必须在使用它之前立即加载所有数据。此外,如果“节点父节点兄弟姐妹”使用相同的数据,我仍然需要创建数据的副本。
是否有一种干净的方式来实现我想要做的事情? 下面列出的是我目前所拥有的
public class Node<Word>{
public Word Data { get; set; }
public Guid ID { get; set; }
..... // other necessary tree like stuff
}
public class Word
{
public Node NodeItem { get; set; }
}
或者
public class Word : Node{}
我希望这个问题足够明确。如果您需要更多详细信息,请告诉我,我会用它更新问题。 谢谢。
答案 0 :(得分:0)
在任何情况下,在您提及的树中搜索都不会是O(logn),因为此树不是二叉搜索树。这是一个无向图,你可以这么说,你需要使用BFS或DFS进行搜索。
如果我正确地对您的情况进行成像,那么在UI上,您可以在窗口的左侧面板中看到一个树,并在右侧面板上显示节点的详细信息。
如果这是用户界面或您的情况,那么
我想说不要在树中存储数据,按需加载,即当用户选择节点时,您将获得该节点的ID,获取带有ID的数据并显示。
通过这种方式,您可以避免可能同时加载所有可能不需要的数据。