【问题标题】:How do I setup a relation table in firebase如何在firebase中设置关系表
【发布时间】:2021-09-24 06:08:01
【问题描述】:

我正在学习 Firebase,并在 Xamrain 表单设置中使用它。例如,我有一个学生列表,这些学生列表中的每个学生都附有锻炼。

我的主要问题是如何设置一个关系表我认为当我使用 c# 中的 guid.newguid 创建我的学生时我做的是正确的事情,以便我有一些方法可以根据它过滤掉锻炼学生。

另外,当我们最终将它发送给客户时,如何创建没有数据的表。例如,在 SQL 中,我可以准备好空表供客户使用他们的应用程序,我仍然可以在 firebase 中使用它吗?

public async Task AddStudent(Guid studentId, string name)
{
        DateTime date = DateTime.Now;
        await firebase
          .Child("Students")
          .PostAsync(new Student() { Id = Guid.NewGuid(), FirstName ="Matt",LastName="Smith",DOB=date.AddDays(-43) });

        await firebase
          .Child("Students")
          .PostAsync(new Student() { Id = Guid.NewGuid(), FirstName = "Martha", LastName = "Jones",DOB=DateTime.Now.AddDays(-36) });
}

我的学生班级

public class Student
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string EmailAddress { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }     
    public DateTime? DOB { get; set; }
    public bool? isActive { get; set; }

}

public class Workout
{
    public Guid Id { get; set; }
    public Guid StudentId{ get; set; } 
    public decimal PB { get; set; } 
    public decimal PU { get; set; } 
 }

我想列出针对每个学生的锻炼,我很难理解 firebase 和其他数据库不喜欢关系数据。拥有多年的 SQL 背景。

【问题讨论】:

    标签: c# firebase firebase-realtime-database google-cloud-platform xamarin.forms


    【解决方案1】:

    例如,我有一个学生列表,这些学生列表中的每个学生都附有锻炼。

    Cloud FirestoreRealtime Database 这两个数据库都可以帮助您实现您想要的。但是由于您使用了 标签,我将向您展示一个数据库结构,您可以在其中创建学生和锻炼之间的关系。

    Firebase-root
      |
      --- students
      |    |
      |    --- $studentId
      |           |
      |           --- //student details
      |
      --- workouts
           |
           --- $studentId
                  |
                  --- //workout details
    

    如您所见,不需要任何非规范化(复制数据)。要获得与特定学生对应的锻炼,您应该创建一个指向 workouts/$studentId 节点的引用。您还可以在每个特定学生下嵌套锻炼,但这意味着每次下载学生数据时,都会将其与所有锻炼一起下载。因此,由您决定哪种解决方案更适合您的应用程序。

    【讨论】:

      【解决方案2】:

      NoSQL 数据库中没有表,因此这些与联结表的关系不存在。使用 NoSQL 数据库(任何 NoSQL,不只是 RTDB 或 Firestore)时,其结构和方法与您习惯的 SQL 结构完全不同,因此您必须学会停止从 SQL 角度思考。 NoSQL 数据库通常包含结构松散的文档,而不是高度结构化的表(RTDB 有点不同)。

      在 NoSQL 数据库中跟踪关系的方法是实际复制该数据片段。例如,您有一个锻炼和用户列表。每个锻炼都与多个用户相关联。您要做的是在每次锻炼时创建对每个用户的引用(例如,一组用户 ID)。

      由于您具有 SQL 背景,因此可能值得您花时间研究使用 Firestore 而不是 RTDB。 Firestore 更加结构化(使用集合和文档而不是 RTDB 巨大的 JSON 树),并允许更复杂的查询,这可能对您来说更容易使用。数据库之间也存在其他差异,因此请查看here 以选择最适合您项目的数据库

      【讨论】:

        【解决方案3】:

        Firebase 中可用的数据库,包括我假设您正在实施的实时数据库是 NoSQL。 Student 和 Workout 之间的关系可以通过与 SQL 中两个实体之间的关系不同的方式实现。根据 JSON 树的structure,您可以通过以下方式创建 Student 和 Workout 结构:

        {
            "students": {
                "st1": {
                    "name": "john",
                    "age": 24,
                    "workoutroutine": "wk1"
                },
                ...
            },
        
            "workouts": {
                "wk1": {
                    "name": "track",
                    "durationhours": 3 
                },
                ...
            }
        }
        

        在这个简单的示例中(但取决于场景),每个学生都可以映射到特定的锻炼,从而在学生和锻炼之间建立关系。由于实时数据库是一个 JSON 树,您可以在应用程序中实现逻辑以从结构中获取任何类型的字段(例如将“wk1”作为他们的锻炼例程的学生)。 Here 是关于从实时数据库中查询数据的更多信息

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-23
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          • 1970-01-01
          • 2017-06-25
          • 1970-01-01
          相关资源
          最近更新 更多