Как перечислить все возможные ассоциации с учетом реляционной схемы? - PullRequest
0 голосов
/ 04 июля 2019

Некоторый фон

Я работаю над интерфейсом с интенсивным использованием данных, где состояние хранится в контейнере 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

Существуют также более сложные (например, циклические) отношения, такие как соавторы, но я не против написать их вручную, когда возникнет такая необходимость.

Как можно перечислить эти ассоциации между сущностями? Существуют ли уже существующие решения? Я могу представить себе, что происходит обход графа, но, возможно, его лучше решить с помощью методов, о которых я пока не знаю.

...