如何在Exposed中关联Train、Schedule、Stations三张表?
Exposed 表关联实现方案
按照需求,需在三张表间建立以下关联:
- Train.number ↔ Schedule.trNumber(一对多,一个列车对应多条时刻表记录)
- Train.srCode ↔ Stations.name(多对一,多个列车对应同一个出发站点)
- Train.destCode ↔ Stations.name(多对一,多个列车对应同一个到达站点)
- Schedule.stnCode ↔ Stations.name(多对一,多条时刻表记录对应同一个站点)
关联实现代码
在Exposed中,主键关联可直接用references()方法,非主键关联通过foreignKey()在表的init块中声明。以下是修改后的完整表定义:
object Stations : Table() { val name = varchar("name", length = 50) val code = varchar("Code", length = 10) val lat = float("lat") val lng = float("lng") val jn = integer("jn") val updatedOn = integer("updatedOn") override val primaryKey = PrimaryKey(code) // 为name字段添加索引,优化外键关联查询性能 init { index(true, name) // true表示唯一索引,可根据实际业务调整 } } object Train : Table() { val number = varchar("number", length = 10) val name = varchar("name", length = 50) val srCode = varchar("srCode", length = 10) val srcName = varchar("srcName", length = 50) val destCode = varchar("destCode", length = 10) val destName = varchar("destName", length = 50) val runDays = integer("runDays") val classes = integer("classes") val updatedOn = integer("updatedOn") override val primaryKey = PrimaryKey(number) // 建立与Stations的外键关联 init { foreignKey(srCode, Stations.name) // Train.srCode关联Stations.name foreignKey(destCode, Stations.name) // Train.destCode关联Stations.name } } object Schedule : Table() { // Schedule.trNumber关联Train.number,自动创建外键约束 val trNumber = varchar("tr_number", length = 10).references(Train.number) val stnCode = varchar("stn_code", length = 50) val type = integer("type") val arrTime = integer("arr_time") val depTime = integer("dep_time") val dayNum = integer("day_num") val km = varchar("km", length = 10) override val primaryKey = PrimaryKey(trNumber, stnCode) // 建立与Stations的外键关联 init { foreignKey(stnCode, Stations.name) // Schedule.stnCode关联Stations.name } }
关键说明
- Train与Schedule的一对多关联:用
references()直接绑定字段,自动生成外键约束,明确一个列车对应多条时刻表记录的关系。 - 非主键字段关联处理:由于Stations的主键是
code,但需求关联name字段,因此在表的init块中声明外键,同时给Stations.name加索引避免关联查询性能问题。 - 原有主键保持不变:三张表的主键定义维持原样,保证数据唯一性约束不受影响。
内容的提问来源于stack exchange,提问作者Pawandeep Singh
相关产品推荐
相关产品推荐

