某些背景
我正在使用数据密集型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 还有诸如共同作者之类的更复杂的(例如循环)关系,但是我不介意在需要时手动为这些编写代码。
如何列举实体之间的这些关联?有预先存在的解决方案吗?我可以想象涉及到图遍历,但是也许可以使用我尚不知道的方法更好地解决。