代表数据库中的嵌套类吗?

时间:2018-08-15 23:22:20

标签: .net database architecture nosql

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

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以唯一的ID作为主键,因此机器可以属于可以属于的行工厂。基本上摆脱了上面的嵌套结构。但是考虑了以上几点,经过更多考虑之后,我不确定自己是否走对了轨道。

  1. 我不能只遍历机器集合并将其添加到 数据网格逐行显示,因为它们将不再位于树中 层次结构。此外,随着用户添加/删除计算机,他们将 最终随机出现在集合中,因此来自给定的所有机器 工厂和生产线将不再在一起。
  2. 允许用户重新排列生产线中的机器 也有问题,因为生产线中可能有50台机器, 用户正在查看,现在随机散布在 数据库集合中有1000台计算机的集合。
  3. 通过ID查找机器现在意味着遍历整个 寻找那个的集合。我失去了缩小它的好处 先按工厂和生产线排序。

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

有人会提供一些关于架构和设计模式的建议,因为我目前有点迷茫,我应该考虑一下这些建议?谢谢。

1 个答案:

答案 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(),它们捕获每种特定情况所需的代码。

我希望这会有所帮助,但请随时根据需要寻求澄清。