JSON中的多对多关系

Sae*_*ati 11 json many-to-many client-side

考虑这种情况:

您希望以JSON格式向客户端发送一些数据,并且您不想返回服务器.数据由15名教师和100名学生组成.这些实体之间的关系是多对多的(每个学生都学习很多老师,每个老师都教许多学生).

在客户端,向用户显示学生列表.点击任何学生后,他/她的老师名单将被呈现给用户,点击老师后,将显示该老师的所有学生的名单.这导致从学生到教师和副verca的无限点击式导航.

现在,如您所知,JSON仅表示此形式中的一对多关系:

{ "s1" : [ "t1", "t2"], "s2" : [ "t2", "t4" ], "s3" : [ "t1", "t3", "t4"], ...}
Run Code Online (Sandbox Code Playgroud)

你对如何做到这一点有任何想法吗?

Ale*_*der 13

由于JSON没有引用的概念,因此您不必担心它们.定义什么算作教师和学生之间的关系的东西位于数据之外,即仅仅是在运行时通过实体的标识符解释的问题.

var faculty = {
 "teachers": {
   "t1": ["s1","s2","s5"],
   "t2": ["s2","s7","s9"]
  },
 "students": {
   "s1": ["t1","t2"],
   "s2": ["t2","t7"]
  }
}
Run Code Online (Sandbox Code Playgroud)

例如:

alert("Teacher t1's students are: " + faculty.teachers.t1.toString() );
alert("Student s2's teachers are: " + faculty.students.s2.toString() );
alert("Student s2's first teacher's students are: " + faculty.teachers[faculty.students.s2[0]].toString() );
Run Code Online (Sandbox Code Playgroud)

  • 但这意味着会有很多冗余数据。如果教师是完全成熟的对象,并且一个人的电话号码发生变化,则它可能会在多个地方发生变化。我们不应该模仿 RDMBS,在这种情况下,使用单独的“连接”表解决这种情况吗? (2认同)

Exe*_*ian 5

您可以制作成对的数组,将这些关系描述为有向图?

[// from , to
    ["s1", "t1"],
    ["s1", "t2"],
    ["s2", "t2"],
    ["s2", "t4"],
    ["t1", "s1"],
    ["t1", "s2"],
    ["t1", "s3"],
    ["t1", "s4"]
]
Run Code Online (Sandbox Code Playgroud)

不会很简洁。但这将描述您的数据集。