JSON 中的多对多关系

问题描述 投票:0回答:3

考虑这个场景:

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

在客户端,用户会看到学生列表。单击任何学生时,将向用户呈现他/她的教师列表,并且单击教师时,将呈现该教师的所有学生的列表。这导致从学生到教师的无限点击式导航,反之亦然。

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

{ "s1" : [ "t1", "t2"], "s2" : [ "t2", "t4" ], "s3" : [ "t1", "t3", "t4"], ...}

你知道如何做到这一点吗?

json many-to-many client-side
3个回答
13
投票

由于 JSON 没有引用的概念,因此您无需担心它们。定义教师和学生之间关系的因素位于数据之外,也就是说,这只是您在运行时通过实体标识符进行解释的问题。

var faculty = {
 "teachers": {
   "t1": ["s1","s2","s5"],
   "t2": ["s2","s7","s9"]
  },
 "students": {
   "s1": ["t1","t2"],
   "s2": ["t2","t7"]
  }
}

例如:

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() );

7
投票

您可以制作一组对来将关系描述为有向图吗?

[// from , to
    ["s1", "t1"],
    ["s1", "t2"],
    ["s2", "t2"],
    ["s2", "t4"],
    ["t1", "s1"],
    ["t1", "s2"],
    ["t1", "s3"],
    ["t1", "s4"]
]

这不会简洁。但它会描述你的数据集。


1
投票

我希望我的 JSON 格式像 SQL 表一样。

{
  "teachers": [
    { "t_id": 11, "name": "t11" },
    { "t_id": 12, "name": "t12" }
  ],
  "students": [
    { "s_id": 21, "name": "s21" },
    { "s_id": 22, "name": "s22" }
  ],
  "teachers_students": [
    { "t_id": 11, "s_id": 21 },
    { "t_id": 11, "s_id": 22 },
    { "t_id": 12, "s_id": 22 }
  ]
}

在 SQL 术语中,

"teachers"
"students"
表的主键是
"t_id"
"s_id"
。人们可以有相同的名字,所以代理键是最好的。
"teachers_students"
是一个联结表,它使用主键存储其他两个表之间的关系。

我认为“teachers_students”的另一种格式看起来更好:

  "teachers_students": [
    [11, 21],
    [11, 22],
    [12, 22]
  ]
© www.soinside.com 2019 - 2024. All rights reserved.