表示数据库中的嵌套类



我有一些嵌套类,它们目前存储在一个平面文件中。

public List<Factory> Factories
public class Factory
{
public int Id
public string Name
public List<Line> Lines
}
public class Line
{
public int Id
public string Name
public List<Machine> Machines
}
public class Machine
{
public int Id
public string Name
}

有了这种目前的结构,很容易做到以下几点。

  1. 在分层数据网格中向用户(就像一棵树),只需在整个数据树上迭代以及将格式化的行添加到数据网格。然后用户可以添加/编辑/删除任何对象
  2. 允许用户重新排序,例如,他们可以更改生产线内机器的顺序,例如通过简单拖动并将Machine行放在数据中的Line行下方网格然后我可以很容易地更改其中机器的顺序行,因为它们都存储在列表中
  3. 在生产线或工厂内的代码中快速查找机器。我只需要迭代给定生产线或工厂内的机器可能总共只有50台机器,而不是1000台机器所有工厂

现在我的任务是将其存储在数据库中(我正在考虑使用NoSQL文档存储)。因此,我最初的反应是,将有一个表(或NoSQL文档存储中的集合)用于工厂,一个用于行,另一个用于机器,并将唯一ID作为主键,这样机器就可以属于可以属于工厂的行。本质上摆脱了上面的嵌套结构。但仔细想想,考虑到以上几点,我不确定自己是否走上了正轨。

  1. 我不能只是迭代机器的集合并将它们添加到数据网格逐行显示,因为它们将不再位于树中等级制度此外,当用户添加/删除机器时,他们将最终随机出现在集合中,因此给定工厂和生产线将不再在一起
  2. 允许用户重新订购生产线内的机器也有问题,因为生产线上可能有50台机器用户正在查看的,它们现在随机分布在数据库集合中1000台机器的集合
  3. 通过Id查找机器现在意味着对整个收藏正在寻找那个。我失去了缩小范围的好处先从工厂和生产线往下走

更糟糕的是,我必须支持旧的平面文件和新的数据库系统。因此,无论我想出什么解决方案,都必须同时解决这两个问题。所以理想情况下,我想找到一个可以在任何一种情况下使用的单一数据结构。

有人能为我提供关于建筑和设计模式的建议吗?我现在有点迷失了方向?谢谢

如果你正确处理这个任务,它就不那么困难了。

在这种情况下,关键是将显示/操作树的问题与存储/检索数据的问题分开。

目前,您正在读取平面文件并构建树。您的网格代码已经知道如何处理树并相应地更新平面文件。我想你想保留相同的网格结构和功能?

唯一的新部分是从数据库中保存/检索相同的数据,并创建与平面文件相同的树。

步骤1)是用抽象方法定义一个Data类,如loadGrid()和saveGrid()以及搜索所需的其他方法。

步骤2)是为FlatFile定义一个子类,为DBFile定义一个子类,在每一个子类中,您都需要为loadGrid()、saveGrid()等提供存根实现。

步骤3)是完成loadGrid()和saveGrid()的FlatFile实现,然后测试您的网格是否正常工作。例如,FlatFile::loadGrid()将读取平面文件并填充树。FlatFile::saveGrid()会将更新后的树保存为平面文件。

现在,您的主网格代码不再"关心"如何检索或存储数据。

步骤4)是完成loadGrid()和SaveGrid()的DBFile实现,然后测试您的网格是否正常工作。

但在这样做之前,您需要考虑到底想要什么数据库,有几个选择。

最终的选择取决于几个因素,但一个主要因素是数据的结构。正如你所描述的,工厂和生产线之间以及生产线和机器之间有很多关系。任何rdbms(如mySQL或SQLServer)都非常适合此功能。但在您的情况下,NoSQL解决方案似乎也能很好地工作,使用"嵌入式文档"来实现1:many关系。下面是一个使用MongoDB的示例https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/

现在继续并完成loadGrid()和SaveGrid()的DBFile实现,然后测试您的网格是否仍然正常工作。在这种情况下,DBFile::loadGrid()将从数据库中读取数据并填充Tree。DBFile::saveGrid()会将更新后的树保存到数据库中。

请注意,通过定义这种loadGrid()/SaveGrid()类型的接口,您可以继续添加新的方法,并以您喜欢的多种方式保存/检索数据,而无需更改网格代码。您所要做的就是实现loadGrid()和saveGrid(),它们捕获每种特定情况所需的代码。

我希望这会有所帮助,但如果需要,可以随时寻求澄清。

最新更新