如何在给定关系模式的情况下枚举所有可能的关联?

时间:2019-07-04 00:46:12

标签: redux foreign-keys schema code-generation entity-relationship

某些背景

我正在使用数据密集型UI,其中状态存储在Redux容器中。曾经接触过Redux的任何人都知道,有很多重复的样板可以用化简,动作,动作创建者,选择器(类似于查询)等形式编写。

编写这些代码没有任何乐趣,尤其是当涉及许多实体类型和伴随关系时。

因此,我们的想法是与代码生成器一起设计一种关系模式,可以将繁重的工作外包给该代码生成器。

问题

给出一个(假设的)关系模式,如下所示:

const schema = {
  book: {
    attributes: ["id", "name", "subGenreId"],
    foreignKeys: [
      { fromAttribute: "subGenreId", toEntity: "subGenre", toAttribute: "id" }
    ]
  },

  mainGenre: {
    attributes: ["id", "name"]
  },

  subGenre: {
    attributes: ["id", "name", "mainGenreId"],
    foreignKeys: [
      { fromAttribute: "mainGenreId", toEntity: "mainGenre", toAttribute: "id" }
    ]
  },

  author: {
    attributes: ["id", "name"]
  },

  book_author: {
    attributes: ["bookId", "authorId"],
    foreignKeys: [
      { fromAttribute: "bookId", toEntity: "book", toAttribute: "id" },
      { fromAttribute: "authorId", toEntity: "author", toAttribute: "id" }
    ]
  },

  seller: {
    attributes: ["id", "name"]
  },

  seller_book: {
    attributes: ["sellerId", "bookId"],
    foreignKeys: [
      { fromAttribute: "sellerId", toEntity: "seller", toAttribute: "id" },
      { fromAttribute: "bookId", toEntity: "book", toAttribute: "id" }
    ]
  }
};

目标是(当然是通过计算)沿这些行生成选择器(可能忘记了一些):

“直接”关系:

  • books通过subGenre id
  • mainGenre通过subGenre id
  • subGenre通过book id
  • subGenres通过mainGenre id

多对多关系(省略联结表本身):

  • authors通过book id
  • books通过author id
  • books通过seller id
  • sellers通过book id

“遥远的”关系(这很有趣):

  • authors通过mainGenre id
  • authors通过seller id
  • authors通过subGenre id
  • books通过mainGenre id
  • mainGenre通过book id
  • mainGenres通过author id
  • mainGenres通过seller id
  • sellers通过author id
  • sellers通过mainGenre id
  • sellers通过subGenre id
  • subGenres通过author id
  • subGenres通过seller id

还有诸如共同作者之类的更复杂的(例如循环)关系,但是我不介意在需要时手动为这些编写代码。

如何列举实体之间的这些关联?有预先存在的解决方案吗?我可以想象涉及到图遍历,但是也许可以使用我尚不知道的方法更好地解决。

0 个答案:

没有答案