[Day 11] 多对多关联的变形:Parent-Child reference

之前我们看过了透过 DAO 方式,来处理资料之间呈现一对多关联,或者多对多关联的做法。

今天我们来看看,如果资料是呈现 Parent-Child reference 时,我们该怎麽利用 Exposed 框架处理

什麽是 Parent-Child reference

根据官方文件的说法

Parent-child reference is very similar to many-to-many version, but an intermediate table contains both references to the same table.

简单的说,其实就是资料的多对多关系,只是关联的对象变成了同一类别的内容而已。

比方说,之前我们提到多对多关系时,使用的范例是 usertag。如果我们想要建立的,是 useruser 之间的多对多关系,那就变成得用 Parent-Child reference 来处理了。

我们用以下的方式来调整 user 资料表和 DAO 物件

object Users : IntIdTable() {  
    val name = varchar("name", 50)  
}  
  
object UsersToUsers : Table() {  
    val parent = reference("parent_user_id", Users)  
    val child = reference("child_user_id", Users)  
}  
  
class User(id: EntityID<Int>) : IntEntity(id) {  
    companion object : IntEntityClass<User>(Users)  
    var name by Users.name  
    var parents by User.via(UsersToUsers.child, UsersToUsers.parent)  
    var children by User.via(UsersToUsers.parent, UsersToUsers.child)  
}

类似多对多关系时所使用的中间表,我们藉由宣告 UsersToUsers 中间表,来记录 User 之间的关联。

宣告之後,我们就可以用物件的逻辑,来记录每个 user 对应的 parentschildren

SchemaUtils.create(Users)  
SchemaUtils.create(UsersToUsers)  
val alice = User.new {  
 	name = "Alice"  
}  
val bob = User.new {  
 	name = "Bob"  
}  
val carol = User.new {  
 	name = "Carol"  
}
bob.parents = SizedCollection(listOf(alice))  
carol.parents = SizedCollection(listOf(alice, bob))

这样宣告後,我们可以取出纪录的 parents 关联,比方说

carol.parents.forEach { println(it.name) }

这样会取得

Alice
Bob

除了可以透过 bobcarol 取得对应的 parents,还可以反过来透过 alice 物件找出对应的 children 有哪些

alice.children.forEach { println(it.name) }

这样会取得

Bob
Carol

利用 Parent-Child reference 的方式,我们可以用更加直觉的写法,来实现资料之间的关联。进而可以透过资料库,来纪录树状结构的资料呈现。


<<:  day2 CCNA - switch (雷)这东西不简单

>>:  [Day 1] 身为一名普通 iOS 开发者所需的程序知识 Intro

TypeOrm | Repository APIs 用法纪录 1

https://typeorm.io/#/repository-api 常常在使用,但也只有使用到其...

特斯拉中国市场5月份订单减半,股价下滑5%!

说起特斯拉,相信近期大家都比较关注其品牌下电动汽车多次发生事故的新闻,虽然如今看似风波已经过去,但特...

事务的数据持久性解决方案(the data persistence solution for transactions)

**** -资料来源:https : //panoply.io/data-warehouse-gui...

OXYGEN Builder+CLOUDWAYS的见解,网站测速跑分已不再重要

我很肤浅,又爱慕虚荣,曾经一心追求网页载入速度 所幸,运气向来不错,总是能殊途同归压对宝? 虽然说,...

物理访问控制系统(PACS)-重播攻击(Replay attack)

下图演示了针对生物识别系统的九个攻击点。从传感器到特徵提取器的生物特徵数据的回放是其中之一。 . “...