Tuesday, April 16, 2019

Design Amazon Product Page



求问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一下。非常感谢

本帖最后由 staycrazy 于 2016-2-5 00:21 编辑
icynell@hotmail 发表于 2016-2-4 15:36
学习了,非常感谢~!!! 这个问题是地里发的面经,我想面试官大概并不是想看面试者是不是actually了解am ...

这个就从用户交互往回推吧。。你的想法基本是对的

因为是一个物品的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新页面。


Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts