第一站 - 轻松上网从此开始!

上网第一站

当前位置: > SEO >

不就是一个订票网站吗 12306 的核心模型设计思路究竟复杂在哪里?(2)

时间:2016-02-26 08:49来源:网络整理 作者:跌名 点击: 我来投稿获取授权
以下内容来自网络或网友投稿,www.swdyz.com不承担连带责任,如有侵权问题请联系我删除。投稿如果是首发请注明‘第一站首发’。如果你对本站有什么好的要求或建议。那么都非常感谢你能-联系我|版权认领
一张票的核心信息包括:出发时间、出发地、目的地、车次、座位号。持有票的人就拥有了一个凭证,该凭证表示持有它的人可以坐某个车次的某个座位号

  一张票的核心信息包括:出发时间、出发地、目的地、车次、座位号。持有票的人就拥有了一个凭证,该凭证表示持有它的人可以坐某个车次的某个座位号,从某地到某地。所以,一张票,对用户来说是一个凭证,对铁道部来说是一个承诺;那对系统来说是什么呢?不知道。这就是我们要分析业务,领域建模的原因,我们再继续思考吧。

  明白了票的核心信息后,我们再看看 G71 这个车次的高铁,可以卖多少张票?

  讨论前先说明一下,一辆火车的物理座位数(站票也可以看成是一种座位,因为站票也有数量配额)不等于可用的最大配合。所有的物理座位不可能都通过 12306 网站来销售,而是只会销售一部分,比如 40%。其余的还是会通过线下的方式销售。不仅如此,可能有些站点上车的人会比较多,有些比较少,所以我们还会给不同的区间配置不同的限额。

  比如 D31 北京南至上海共有 765 张,北京南有 260 张,杨柳青有 80 张,泰安有 76 张。如果杨柳青的 80 张票售完就会显示无票,就算其他站有票也会显示无票的。每个车次肯定会有各种座位的配额和限额的配置的,这种配置我目前无法预料,但我已经把这些规则都封装近车次聚合根里了,所有的配置策略都是基于座位类型、站点、区间配置的。关于票的配置抽象出来,我觉得主要有 3 种:

  某个区段最多允许出多少张;

  某个区段最少允许出多少张;

  某个站点上车的最多多少张。

  当用户订票时,把用户指定的区段和这 3 种配置条件进行比较,3 个条件都满足,则可以出票。不满足,则认为无票了。下面举个例子:

  ABCDEFG,这是所有站点。座位总配额是 100,假设 B 站点上车,E 站下车的人比较少,那我们就可以设定 BE 这个区段最多只能出 10 张票。所以,只要是用户的订票是在这个区段内的,就最多出 10 张。再比如,一列车次,总共 100 个座位配额,希望全程票最少满足 80 张,那我们只要给 AG 这个区段设定最少 80 张。那任何订票请求,如果是子区间的,就不能超过 100-80,即 20 张。这两种条件必须同时满足,才允许出票。

  但是,不管如何做配额和限额,我们总是针对某个车次进行配置,这些配置只是车次内部售票时的一些额外的判断条件(业务规则),不影响车次模型的核心地位和对外暴露的功能。所以,为了本文讨论的清楚起见,我后续的讨论都不涉及配额和限额的问题,而是认为任何区段都可以享受火车最大的物理座位数。

  并且,为了讨论问题方便,我们减少一些站点来讨论。假设某个车次有 A,B,C,D 四个站点。那 001 这个人购买了 A,B 这个区间,系统会分配给 001 一个座位 x;但是因为 001 坐到 B 站点后会下车,所以相当于 x 这个座位又空出来了,也就是说,从 B 站点开始,系统又可以认为 x 这个座位是可用的。所以,我们得出结论:同一个座位,其实可以同时出售 AB,BC 这两张票。通过这个简单的分析,我们知道,一列火车虽然只有有限的座位数,比如 1000 个座位。但可以卖出的票远远不止 1000 个。

  还是以 A,B,C,D 四个站点为例,假如火车总共有 1000 个座位,那 AB 可以卖 1000 张,BC 也可以卖 1000 张,同样,CD 也可以卖 1000 张。也就是说,理论上最多可以卖出 3000 张票。但是如果换一种卖法,所有人都是买 ABCD 的票,也就是说所有的票都是经过所有站点的,那就是最多只能卖出 1000 张票了。而实际的场景,一定是介于 1000 到 3000 之间。然后实际的 G71 这个车次,有 17 个站,那到底可以卖出多少个票,大家应该可以算了吧。理论上这 17 个站中的任意两个站点之间所形成的线段,都可以出售为一张票。我数学不好,算不太清楚,麻烦有数学好的人帮我算算,呵呵。

  通过上面的分析,我们知道一张票的本质是某个车次的某一段区间(一条线段),这个区间包含了若干个站点。然后我们还发现,只要区间不重叠,那座位就不会发生竞争,可以被回收利用,也就是说,可以同时预先出售。

  另外,经过更深入的分析,我们还发现区间有 4 种关系:

  不重叠;

  部分重叠;

  完全重叠;

  覆盖。

  不重叠的情况我们已经讨论过了,而覆盖也是重叠的一种。所以我们发现如果重叠,比如有两个区间发生重叠,那重叠部分的区间(可能夸一个或多个站点)是在争抢座位的。因为假设一列火车有 100 个座位,那每个原子区间(两个相邻站点的连线),最多允许重叠 99 次。

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发布者资料
第一站编辑 查看详细资料 发送留言 加为好友 用户等级:注册会员 注册时间:2012-05-22 19:05 最后登录:2014-08-08 03:08
栏目列表
推荐内容
分享按鈕