关于标签系统的又一点想法。
前段时间,写过一篇《关于标签系统的一点想法。》。但其实没有谈到里面的内容,是有一部分来自与刘鑫老师的聊天,当时他给了我许多肯定,也是让我觉得记录下来很有必要的原因。
前一篇里没有提到,我跟刘老师谈到一个更加深入一点的、关于标签系统的想法。主要原因是因为我尚不肯定这是否也属于标签系统。直到最近disylee 送了一本标签 : 标记系统设计实践给我,里面的一个小节让我为自己的想法找到了理论依据。
很不错的一本书,没有让我失望,解答了我心中的一些困惑。书有点啰嗦,但也正因为此显得“系统”,我向来觉得“系统”的知识才是知识,第三、四章是精华,喜欢思考的架构师可以一读。
接下来谈谈我的“又一点想法”。
大家做项目的时候,肯定为很多“属性”所烦恼过。比如你做一个电商网站,是卖衣服的,结果你为衣服建模,定义了一堆类似品牌、尺寸、颜色、材料、款式、工艺等字段。后来又做一个卖家具的电商网站,你发现之前定义的这些字段基本上没有用了。举个例子,之前衣服的尺寸,可能只是裤子的腰围,现在沙发的尺寸,却是长宽高的三维数据;如果把三维数据硬塞进原来的尺寸字段,又不利于检索和过滤。
这样的项目做多了,我就开始想,其实尺寸、品牌,等等,不就是一个标签吗?我随便加就是了。这时候遇到一个问题,就是标签的多义性,比如某物品你加了一个“绿色”的标签,这个有可能是它的外观是绿色的,也可能是它的品质是绿色的(有机食品什么的)。抓狂。这时候你可能会想到把属性名也加上去,比如以“color:green”作为标签,以消除二义性。
赞赞赞!
你跟我想到一块了。不过再往深想你会发现每次都需要对标签尝试做 attr:value 切分,还是非常不方便的,而且很多时候你需要在界面上对 attr 所对应的 value 进行归纳,因为在用户层面你最好是提供一个“颜色”的下拉框来让他选择,而不是让他输入 green。
所以我想到要建立两个表,一个专门来管理系统中用到的 attr,另一个则是相应的 value。在跟刘老师沟通时候,我想到的就是这些,这让我有点怀疑“这还算不算是标签”?走到读完上文说过的那本书,从那个 1930 年的印度图书管理员那里找到了依据,是的,这仍然是标签,但一般又称之为 Faceted classification。
每一个 facet 可以视为度量一个物体的角度。那么刚才说过的:
所以我想到要建立两个表,一个专门来管理系统中用到的 attr,另一个则是相应的 value。
就很合理了。这样的一个标签系统是如此的合理,以至于已经在许多现代电商网站已经使用多年,比如 amazon 能够很方便地使用尺寸、颜色甚至价格区间来进行商品检索,就得益于此。
当然,这方面也有很多开源的项目,额,可能我搜索的姿势不对,java 方面暂时没有找到相关的库,但 Python 的话,有一个基于 django 的 djfacet,也有一个基于 plone 的 collective.facets。壮哉我大蛇教。
额,至于 PHP,最好的编程语言大概是不需要这些的。哈哈!