从SQL(C#和实体框架)到mongodb(Go和mgo)

时间:2018-12-09 00:42:51

标签: c# mongodb entity-framework go

我今天来是因为我必须从SQL(使用实体框架)迁移到MongoDb,但是,编程方面的数据库方面是我不是专家的领域,我想为演进做出最佳选择我正在研究的程序。

让我说我有这个数据库模式(一个主意,而不是实际情况):

enter image description here

所以我有一所学校。在这所学校,我有课,那些课有学生。外键是斜体字段。

它应该在C#中给出类似的内容:

public class SchoolEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } = new Guid();

    public string Name { get; set; }

    [InverseProperty("School")]
    public virtual ICollection<ClassTeachingEntity> ClassTeachings { get; set; }
}

public class ClassTeachingEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } = new Guid();

    public Guid SchoolId { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    [ForeignKey("SchoolId")]
    public virtual SchoolEntity School { get; set; }

    [InverseProperty("ClassTeaching")]
    public virtual ICollection<StudyingEntity> StudyingEntities { get; set; }
}

public class StudyingEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } = new Guid();

    [Index("UniqueStudyingRelation", Order = 1, IsUnique = true)]
    public Guid UserId { get; set; }

    [Index("UniqueStudyingRelation", Order = 2, IsUnique = true)]
    public Guid ClassTeachingId { get; set; }

    [ForeignKey("UserId")]
    public virtual UserEntity User { get; set; }

    [ForeignKey("ClassTeachingId")]
    public virtual ClassTeachingEntity ClassTeaching { get; set; }
}

public class UserEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; } = new Guid();

    public string Firstname { get; set; }

    public string Lastname { get; set; }

    [InverseProperty("User")]
    public virtual ICollection<StudyingEntity> StudyingEntities { get; set; }
}

我的问题是,首先,当前结构是否良好? (我没有设计它,它是我来之前就已经意识到的,我比数据库专家更像是一个初学者)

第二个问题是,我是否必须从四个不同的表中仅创建一个文档?因为据我所知,在mongodb中,这是一个JSON逻辑,因此我可以存储嵌套对象吗?

我不知道此信息是否重要,但是我将在mongodb(而不是C#)中使用Go。

感谢您的反馈

2 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,则必须将现有的C#+ SQL程序迁移到GO + Mongo堆栈。您正在尝试提出类似is the current structure good之类的技术问题来解决它。

这里缺少东西。

每种技术都只是解决业务问题的方法。这是什么业务问题?您的问题不能解释这一点。

在进入技术方面之前,请尝试获取以下问题的答案:

  1. C#和SQL解决方案出了什么问题,所以我们必须用新的替换它?
  2. 在现有的RDBMS数据模型中什么不起作用?

无论如何,请谨慎尝试将RDBMS和ORM模式应用于mongo DB。这是非常不同的数据存储类型(文档DB),RDBMS模型不能仅复制到其中。

答案 1 :(得分:2)

1-当前的结构看起来还可以。当然,这取决于您的具体情况,但这似乎很好。

2-您可以,但不必。当您的数据没有关系时,仅拥有一个文档是有意义的。就您而言,将它们分开可能更有意义,否则您可能会有很多重复的条目。您可以使用 $ lookup 聚合在文档之间执行联接。

请小心 $ lookup 。我上一次阅读有关内容的信息时,如果将您的数据分片,则Mongo不支持此操作。