基于MySQL实现船舶所有权变更与年份关联查询的技术咨询
可行方案:船舶所有权数据库设计与查询
表结构设计
1. 船舶基础信息表(ships)
存储船舶固定属性,避免数据冗余:
ship_idINT PRIMARY KEY AUTO_INCREMENT:唯一标识船舶的主键ship_nameVARCHAR(100) NOT NULL:船舶名称imo_numberVARCHAR(20) UNIQUE:可选(推荐添加),全球唯一的国际海事组织编号,避免重名混淆- 其他字段(如
gross_tonnage总吨位、built_year建造年份)可按需添加
2. 船舶所有权变更记录表(ship_ownership_history)
记录船舶每次转售的所有权周期,关联船舶ID实现历史追踪:
history_idINT PRIMARY KEY AUTO_INCREMENT:主键ship_idINT NOT NULL FOREIGN KEY REFERENCES ships(ship_id):关联船舶表的外键company_nameVARCHAR(100) NOT NULL:所属公司名称start_dateDATE NOT NULL:该公司持有船舶的起始日期(转售完成日期)end_dateDATE:该公司持有船舶的结束日期(未转售则设为NULL)
核心查询实现
通过船舶名称+年份查询对应所属公司的SQL语句:
SELECT s.ship_name, soh.company_name FROM ships s JOIN ship_ownership_history soh ON s.ship_id = soh.ship_id WHERE s.ship_name = '目标船舶名称' AND ( -- 年份落在当前所有权周期内 (YEAR(soh.start_date) <= 2020 AND YEAR(soh.end_date) >= 2020) OR -- 该年份时船舶仍由当前公司持有(未转售) (YEAR(soh.start_date) <= 2020 AND soh.end_date IS NULL) );
替换'目标船舶名称'和2020为实际查询值即可。
数据维护说明
- 首次录入:第一家公司的记录中,
start_date填船舶交付日期,end_date设为NULL - 转售更新:船舶转售时,先更新上一条所有权记录的
end_date为转售日期,再插入新记录,start_date填转售日期,end_date设为NULL
内容的提问来源于stack exchange,提问作者Anika Conley
相关产品推荐
相关产品推荐

