我有一些嵌套的类,目前它们存储在平面文件中。
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
}
使用这种当前结构,很容易执行以下操作。
现在,我负责将其存储在数据库中(我正在考虑使用NoSQL文档存储)。因此,我的最初反应是,将有一个表(或NoSQL文档存储中的集合)用于工厂,一个用于行,一个用于机器,其ID以唯一的ID作为主键,因此机器可以属于可以属于的行工厂。基本上摆脱了上面的嵌套结构。但是考虑了以上几点,经过更多考虑之后,我不确定自己是否走对了轨道。
使情况更糟的是,我必须支持旧版平面文件以及新的数据库系统。因此,无论我想出什么解决方案,都必须同时解决这两个问题。因此,理想情况下,我想找到一个可以在任何一种情况下使用的单一数据结构。
有人会提供一些关于架构和设计模式的建议,因为我目前有点迷茫,我应该考虑一下这些建议?谢谢。
答案 0 :(得分:0)
如果您正确地完成此任务,就没那么困难了。
在这种情况下,关键是将显示/操作树与存储/检索数据分开。
当前,您正在读取平面文件并构建Tree。您的网格代码已经知道如何处理树并相应地更新平面文件。我假设您想保留相同的网格结构和功能?
然后唯一的新部分是从数据库中保存/检索相同的数据,并创建与对平面文件所做的相同的Tree。
步骤1)是使用抽象方法(例如loadGrid()和saveGrid()以及搜索所需的其他任何东西)定义一个Data类。
第2步是为FlatFile定义一个子类,为DBFile定义一个子类,并且在每个这些子类中,您都需要为loadGrid(),saveGrid()等提供存根实现。
第3步是完成loadGrid(),saveGrid()的FlatFile实现,然后测试网格是否正常工作。例如FlatFile :: loadGrid()将读取平面文件并填充您的Tree。 FlatFile :: saveGrid()会将更新的Tree保存到平面文件。
现在,您处于良好状态,主网格代码不再“关心”数据的检索或存储方式。
步骤4)是完成loadGrid(),SaveGrid()的DBFile实现,然后测试您的网格是否正常工作。
但是在执行此操作之前,您需要准确考虑所需的数据库,并且有多种选择。
最终选择取决于几个因素,但是主要的选择是数据的结构。正如您所描述的,“工厂”与“生产线”之间以及“生产线”与“机器”之间存在1:许多关系。任何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()会将更新的Tree保存到数据库中。
请注意,通过定义这种loadGrid()/ SaveGrid()接口,您可以继续以各种方式添加新的方式来保存和检索数据,而不必更改网格代码。您要做的就是实现loadGrid(),saveGrid(),它们捕获每种特定情况所需的代码。
我希望这会有所帮助,但请随时根据需要寻求澄清。