You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    }
}

关键说明

  1. Train与Schedule的一对多关联:用references()直接绑定字段,自动生成外键约束,明确一个列车对应多条时刻表记录的关系。
  2. 非主键字段关联处理:由于Stations的主键是code,但需求关联name字段,因此在表的init块中声明外键,同时给Stations.name加索引避免关联查询性能问题。
  3. 原有主键保持不变:三张表的主键定义维持原样,保证数据唯一性约束不受影响。

内容的提问来源于stack exchange,提问作者Pawandeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 12:15:25