【问题标题】:Many to many relationships in JSONJSON 中的多对多关系
【发布时间】:2011-11-09 02:39:52
【问题描述】:

考虑这种情况:

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

在客户端中,用户会看到学生列表。点击任何一个学生,他/她的老师的列表将呈现给用户,点击一个老师,该老师的所有学生的列表将被呈现给用户。这会导致从学生到教师的无限点击式导航,反之亦然。

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

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

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

【问题讨论】:

  • 好问题,谢谢!!

标签: json many-to-many client-side


【解决方案1】:

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

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

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

【讨论】:

  • 这是一个黑客。但这是一个很好的建议@Exelian。谢谢和 +1。
【解决方案2】:

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

【讨论】:

  • 但这意味着会有很多冗余数据。如果老师是完全成熟的对象,并且一个人的电话号码发生了变化,那么它可能会在多个地方发生变化。我们不应该模仿 RDMBS,用单独的“连接”表解决这种情况吗?
  • 貂,一点也不。 { ..[snip]... "t1": { "students": ["s1","s2"], "phone": "+43 1 58801" } }
【解决方案3】:

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

{
  "teachers": [
    { "t_id": 0, "name": "t0" },
    { "t_id": 1, "name": "t0" }
  ],
  "students": [
    { "s_id": 0, "name": "s0" },
    { "s_id": 1, "name": "s1" }
  ],
  "teachers_students": [
    { "t_id": 0, "s_id": 0 },
    { "t_id": 0, "s_id": 1 },
    { "t_id": 1, "s_id": 1 }
  ]
}

在 SQL 术语中,"teachers""students" 表的主键是 "t_id""s_id"。人们可以有相同的名字,所以代理键是最好的。 "teachers_students" 是一个联结表,通过它们的主键存储另外两个表之间的关系。

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

  "teachers_students": [
    [0, 0],
    [0, 1],
    [1, 1]
  ]

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2020-11-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 2021-11-08
    • 2017-05-15
    • 2013-11-20
    • 2018-06-15
    相关资源
    最近更新 更多