Некоторый фон
Я работаю над интерфейсом с интенсивным использованием данных, где состояние хранится в контейнере 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
Существуют также более сложные (например, циклические) отношения, такие как соавторы, но я не против написать их вручную, когда возникнет такая необходимость.
Как можно перечислить эти ассоциации между сущностями? Существуют ли уже существующие решения? Я могу представить себе, что происходит обход графа, но, возможно, его лучше решить с помощью методов, о которых я пока не знаю.