求问LinkedIn设计题:设计Amazon Product Page
设计Amazon Product Page, 在SQL里面一个产品有多个图片多个价格的话怎么设计数据库。后台提取数值render到页面上得时候,class怎么设计,服务器怎么安排,另外怎么考虑suggest product。
为什么要定死是SQL。。。其实column based是更合适的数据库。
Amazon有一个概念叫ASIN,http://www.amazon.com/gp/seller/asin-upc-isbn-info.html Amazon Standard Identification Number
无论是你用SQL还是HBase,对应这个产品这个detail page的asin是你设计的这个table的primary key。
然后因为有不同颜色的variation,这个table有一列应该是指明该asin是否是parent asin:http://docs.aws.amazon.com/AWSECommerceService/latest/DG/VariationParent.html
Parent asin的price之类的column都可以缺失。
然后它对应的variation是一个map,以各种不同的configuration对应不同的子asin。
子asin也同样是这个表中的条目,但是它们有price,可以被purchase。
设计class主要是围绕着ProductItem来,就不细说了。
要有一个默认的子asin,而每个asin有对应的一系列图片url,这样你切换颜色的时候就可以切换一系列图片。
这里比较tricky的地方是当有多个变化维度的时候(比如说color和size),如何去让上面的设计adapt这个新的需求(先卖个关子。。提示:多重parent asin可以解决这个问题,或者要改schema
suggest product属于recommendation system的内容,基本上做个简单的只要搞聚类就行了。后端处理推荐的时候主要是offline,因为这玩意实时性要求不高
这个问题是地里发的面经,我想面试官大概并不是想看面试者是不是actually了解amazon的架构,而是给出购物平台/网站这样的一个scenario,想让设计database schema以及前后台怎么更高效地交互。
我自己本身并没有在实际工作中整体设计system或者database的机会,我在准备这道题的时候自己列了一下需要的table,按照relational db的一些原则设计的,你说得很对在一些特定的query条件下nosql应该更合适,尤其当涉及到要经常join很多table的时候mysql比较就昂贵。之前没有想到引入parent的设计,看了你的回复非常受启发,这点确实是不是relational都可以用,应该可以improve一下。非常感谢
设计Amazon Product Page, 在SQL里面一个产品有多个图片多个价格的话怎么设计数据库。后台提取数值render到页面上得时候,class怎么设计,服务器怎么安排,另外怎么考虑suggest product。
为什么要定死是SQL。。。其实column based是更合适的数据库。
Amazon有一个概念叫ASIN,http://www.amazon.com/gp/seller/asin-upc-isbn-info.html Amazon Standard Identification Number
无论是你用SQL还是HBase,对应这个产品这个detail page的asin是你设计的这个table的primary key。
然后因为有不同颜色的variation,这个table有一列应该是指明该asin是否是parent asin:http://docs.aws.amazon.com/AWSECommerceService/latest/DG/VariationParent.html
Parent asin的price之类的column都可以缺失。
然后它对应的variation是一个map,以各种不同的configuration对应不同的子asin。
子asin也同样是这个表中的条目,但是它们有price,可以被purchase。
设计class主要是围绕着ProductItem来,就不细说了。
要有一个默认的子asin,而每个asin有对应的一系列图片url,这样你切换颜色的时候就可以切换一系列图片。
这里比较tricky的地方是当有多个变化维度的时候(比如说color和size),如何去让上面的设计adapt这个新的需求(先卖个关子。。提示:多重parent asin可以解决这个问题,或者要改schema
suggest product属于recommendation system的内容,基本上做个简单的只要搞聚类就行了。后端处理推荐的时候主要是offline,因为这玩意实时性要求不高
这个问题是地里发的面经,我想面试官大概并不是想看面试者是不是actually了解amazon的架构,而是给出购物平台/网站这样的一个scenario,想让设计database schema以及前后台怎么更高效地交互。
我自己本身并没有在实际工作中整体设计system或者database的机会,我在准备这道题的时候自己列了一下需要的table,按照relational db的一些原则设计的,你说得很对在一些特定的query条件下nosql应该更合适,尤其当涉及到要经常join很多table的时候mysql比较就昂贵。之前没有想到引入parent的设计,看了你的回复非常受启发,这点确实是不是relational都可以用,应该可以improve一下。非常感谢
本帖最后由 staycrazy 于 2016-2-5 00:21 编辑 这个就从用户交互往回推吧。。你的想法基本是对的 因为是一个物品的detail page,所以说在更换颜色或者大小的时候,最好用ajax来取得新setting的信息,这就要求我们要有一个办法把db里面的数据转成json (但是我们为了降低latency不可能每一次都ajax——第一次render的时候,假设我们用的是Spring框架,那么jsp里面的数据是dispacth的时候已经填好的,还有为了兼容不支持javascript的browser也不能只支持ajax——这也就应和了第一次render不用ajax的要求。。) 这里有一个考虑就是我们要不要在web app这一层引入一个对象映射,还是说直接把数据库里面的内容映射成map或者json。我个人偏好是应该还是要有一个DAO。否则的话我们在web app层会引入一些维护问题——如果我们用的是no sql,schema definition就无处可寻了。当然如果你用relational,基本是hibernate orm那一套,这个就不用担心了。 所以流程大概就是,第一次load的时候从db读出一个item,然后render到template上(jsp/ejs/...),发回给用户。 用户改变产品颜色,javascript代码发一个ajax请求给服务端,服务端读出对应的product,序列化成json然后发还给browser。javascript处理json然后用无论什么奇特的方法(jQuery)去改变页面内容。 如果browser不支持javascript,则直接加url参数load新页面。 |