.net 表示数据库中的嵌套类?

.net 表示数据库中的嵌套类?,.net,database,architecture,nosql,.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>

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

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
}
公共列表工厂
公营工厂
{
公共整数Id
公共字符串名
公共列表行
}
公共班级线
{
公共整数Id
公共字符串名
公共列表机器
}
公共类机器
{
公共整数Id
公共字符串名
}
使用当前的结构,很容易执行以下操作

  • 将分层数据网格中的工厂列表显示到 用户(就像一棵树),只需迭代整个数据树 以及将格式化的行添加到数据网格。然后用户可以 添加/编辑/删除任何对象
  • 允许用户重新排序,例如,它们可以更改 机器在一行中的顺序,例如通过简单的拖动 并将机器行放在数据行的下面 网格。然后我可以很容易地改变机器的顺序 行,因为它们都存储在一个列表中
  • 在一条生产线或工厂内快速找到一台机器。我只需要 迭代给定行或工厂内的机器,其中 可能总共只有50台机器,而不是1000台 所有工厂都有
  • 现在我的任务是将其存储在数据库中(我正在考虑使用NoSQL文档存储)。因此,我最初的反应是,工厂将有一个表(或NoSQL文档存储中的集合),一个用于行,另一个用于具有唯一ID作为主键的机器,因此机器可以属于属于工厂的行。基本上摆脱了上面的嵌套结构。但是考虑到以上几点,我不确定自己是否走上了正确的道路

  • 我不能只是迭代机器集合并将它们添加到 数据网格将逐行显示,因为它们不再位于树中 等级制度此外,当用户添加/删除计算机时,它们将 在集合中随机结束,因此来自给定 工厂和生产线将不再在一起
  • 允许用户在一条生产线内重新订购机器 也有问题,因为生产线上可能有50台机器 用户正在查看,这些数据现在随机分布在 数据库集合中1000台机器的集合
  • 现在,通过Id查找机器意味着对整个系统进行迭代 我在找那个。我失去了缩小范围的好处 先按工厂和生产线下线
  • 更糟糕的是,我必须支持传统的平面文件以及新的数据库系统。因此,无论我提出什么解决方案,都必须对两者都起作用。因此,理想情况下,我希望找到一个可以在任一场景中使用的单一数据结构


    有人能给我提供一些关于架构和设计模式的建议吗?我现在有点不知所措?谢谢。

    如果你正确地完成了这项任务,就不会那么困难了

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

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

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

    步骤1)是使用抽象方法(如loadGrid()和saveGrid()以及搜索所需的任何其他方法)定义数据类

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

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

    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
    }
    
    现在,您的主网格代码不再“关心”如何检索或存储数据,这是一个很好的位置

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

    <>但是在你这样做之前,你需要考虑你想要什么样的数据库,并且有几种选择。 最终的选择取决于几个因素,但一个主要因素是数据的结构。正如您所描述的,工厂和生产线之间以及生产线和机器之间存在着1:许多关系。任何rdbms(如mySQL或SQLServer)都非常适合这样做。但在您的情况下,NoSQL解决方案似乎也能很好地工作,使用“嵌入式文档”来实现1:many关系。下面是一个使用MongoDB的示例

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

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


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

    我觉得像loadGrid()这样的方法存在的问题是,数据会以静态方式传递到网格,只有在调用saveGrid()时才会再次保存,这会一次保存所有数据。我正试图找到一种方法,以更细粒度的方式在网格和数据之间工作,这样当用户进行更改时,数据库会立即更新,允许其他用户查看更改而无需hav