如果我设计12306火车票的库和表

2017-01-13 10:46:56来源:oschina作者:长工人点击

chezhan表:


200台机器运行MySQL,每一台MySQL机器用一个库,每个库里有chezhan,chepiao_2017_01_01, chepiao_2017_01_02 ...等若干张表,如果今天是2017_01_02,那么之前日期对应的表应该被删除,按照铁道部规定,只能买10天之内的车票,那么该库中的表最远是chepiao_2017_01_12。


注意:我这里200辆是对中国所有车次总数的估计,网上也有人说有1000车次左右。


车次 站次 站名


G162 1 安庆 G162 2 池州 G162 3 铜陵 G162 4 铜陵北 G162 5 无为 G162 6 合肥南 G162 7 淮南东 G162 8 蚌埠南 G162 9 徐州东 G162 10 滕州东 G162 11 济南西 G162 12 德州东 G162 13 天津南 G16214 北京南


chepiao_2017_1_1表:


起点 终点 车厢号 座位号


1 14 1 1 1 14 1 2


1 14 1 118


1 14 2 1 1 14 2 2


1 14 2 118

1 14 10 1 1 14 10 2


1 14 10 118


以上共10节车厢,每节车厢有1-118号座位,新的一天,车票开始对外出售,新建一张chepiao_2017_1_2表,并插入记录。


估算:一辆列车10节车厢,一节车厢120个座位,共1200条记录。用MySQL实验下插入1200条记录需要37.39秒。

mysql> use test
Database changed
mysql> create table chepiao (
->checi char(10),
->qidian int,
->zhongdian int,
->chexiang int,
->zuowei int
-> )
-> ;
Query OK, 0 rows affected (0.22 sec)
mysql> insert into chepiao (checi, qidian, zhongdian, chexiang, zuowei) values (
'G162', 1, 14, 1, 1);
Query OK, 1 row affected (0.03 sec)
mysql>
mysql>
mysql> desc chepiao;
+-----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+----------+------+-----+---------+-------+
| checi | char(10) | YES| | NULL||
| qidian| int(11)| YES| | NULL||
| zhongdian | int(11)| YES| | NULL||
| chexiang| int(11)| YES| | NULL||
| zuowei| int(11)| YES| | NULL||
+-----------+----------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> select * from chepiao;
+-------+--------+-----------+----------+--------+
| checi | qidian | zhongdian | chexiang | zuowei |
+-------+--------+-----------+----------+--------+
| G162|1 | 14 | 1 |1 |
+-------+--------+-----------+----------+--------+
1 row in set (0.01 sec)
mysql>

如下的存储过程循环插入1200条记录,在Windows XP, MySQL5.5上测试插入时间为37.39秒。


delimiter //
drop procedure if exists InsertProc;
create procedure InsertProc()
begin
declare i int;
set i = 0;
while i < 1200 do
insert into chepiao (checi, qidian, zhongdian, chexiang, zuowei) values ('G162', 1, 14, 1, 1);
set i = i + 1;
end while;
end//
delimiter ;
mysql> call InsertProc();
Query OK, 1 row affected (37.39 sec)

1. 当出售一张安庆-北京南的车票时,从表中删除对应座位的记录。


2. 出售一张无为-济南西1车厢1号的车票,系统需要表中删除该条记录,同时增加起点到终点分别是1-5,11-14的1车厢1号座位的票,并且删除记录和增加记录的操作必须是原子事务的,也就是说要么全部完成,要么全部回滚。


3. ......

另外多加一台机器存储这200台机器的chezhan表,如果甲乙两地都从表中查询到,并且甲对应的站次小于乙对应的站次,且对应的车次相同,那么该列车是符合条件的查询;然后再从该车次对应的chepiao_2017_1_1表里查询对应的车票。


最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台