G2Rail的演进过程中会遇到很多实际的问题,而且很多时候需要很多实际的(而不是优雅)方法来解决。
今天就有一个例子,在G2Rail数据库中有全球五万多个城市中有不少城市是重名的。比如在G2Rail的车站搜索框里面输入Berlin,就会出现一串柏林,除了我们最熟悉的那个柏林,还有美国康涅狄格州的柏林,马里兰州的柏林,新罕布什尔州的柏林,俄亥俄州的柏林,佛蒙特州的柏林,俄亥俄州的柏林。
为了区分这些柏林,会在城市的后面加上国家或者是州的缩写,比如Berlin CT,其中CT是Connecticut的缩写。系统会用英文名字作为该城市的slug (a part of a URL which identifies a particular page on a website in a form readable by users.)。
因为开始忽视了Berlin这样的城市,导致很多城市的slug中有’,’,这对于阅读,搜索引擎优化都不是很友好。因此跟文商量把’,’替换成’-‘,其实方案就是对于城市slug作字符串操作替换gsub(‘,’, ‘-‘)。所以新的城市slug会变成https://www.g2rail.com/cities/berlin-ct。
这是一种最优的方法,可是这会导致一个新问题。因为https://www.g2rail.com/cities/berlin,ct这样的url已经提交给了搜索引擎索引,而这意味着很多这样的url都会报404错误。而这样会导致Google爬虫抱怨,从而影响我们的Reputation。
也不能简单在系统中做反向处理(把’-‘替换成’,’),因为其实有更多的城市名字里面本来就有’-‘,比如法国的Anglards-de-Saint-Flour和Angoustrine-Villeneuve-des-Escaldes。
这是文同学给出了一个更加实际的方案,把原先slug中的’,’替换成两个’–‘,gsub(‘,’,’–‘)。这样就很容易区分出哪些旧slug的url,从而针对性的反向替换,然后Route到对应的城市网页。
接下来,意味着
- 所有城市slug的重新生成
- 基于新的url的sitemap的重新生成和提交
- 添加处理就slug的逻辑。
反思
这其实是G2Rail打穿团队日常的典型问题,而这个解决方案也引发了我的反思:
- 把逗号替换成一个还是两个’–‘,并不是一个技术人员解决方案,是包括数据、搜索引擎知识、业务场景、系统和数据演进历史等多方面综合考虑的方案。
- 这些用于解决数据和业务的“技术”方案其实是在无数的掉坑,不断地解决实际问题中涌现出来的结果。纯粹的技术人员很少会关注于这种解决方案。
- 很难在一开始就有完美的数据和数据结构,这其实是一个演进的过程,如何让数据平滑的迁移,不影响到既有用户的使用需要花很多精力,也需要很多创新性的数据迁移方式。