我正在开发一种网络服务,可以比较多家商店的产品价格。
我有以下数据库设计(简化):
Store:
- id PK
- name
- url
Product:
- id PK
- name
ProductPricing:
- productUrl PK
- store
- price
- date
- discount
没有理想的世界,所以来自不同商店的产品可能会有所不同。产品名称可能拼写不同或包含一些其他字符(例如IV而不是4)/。这就是为什么我决定使用URL作为Pricing
表主键。
价格按产品分组(有一个名称和更多其他属性)。从商店API插入产品定价时,会有一个查询检查数据库中是否存在这样的产品(在一些字符串清理之后)。如果没有这样的产品,那么正在创建新产品。
我想知道这是否是最佳方法?如果任何商店会更改其网址结构怎么办?这样的数据库设计是否足够有效?
更新 @Gordon Linoff带来了一系列非常好的问题。一些答案和澄清可以在下面找到。
应用程序中产品的主要属性是什么?绝对是产品名称。将产品名称存储为主键的关键问题是,在插入新产品 /之前,商店中的名称不同/有一个内部服务来修复应用程序中的名称。
该应用程序的关键功能是识别不同商店的不同产品。第二个关键特征是多个商店中的产品和价格/定价历史之间的联系/这就是为什么作为主要关键想法的URL已经诞生/.
用户如何看待价格?
有趣的问题。将有一个产品列表,其中包含产品名称/和其他一些属性/。在一个视图中,将有不同商店的价格列表。就是这样。
另一方面,产品定价将每天更新一次。如果任何URL发生更改,应用程序将尝试根据产品名称进行定价。如果Product
表/中有数据库行,则应用程序会将找到的Product
与新Pricing
项连接起来。因此,如果任何商店将更改其URL结构,应用程序不应该受到影响。我错过了什么吗?
也许我应该将URL作为常规属性/列存储在数据库中,而不是将其用作主键/?
答案 0 :(得分:0)
评论太长了。
使用远程控制的URL作为产品的主键似乎是一个非常糟糕的主意。您无法控制该网址。并且,这些事情不会随着呜咽而发生变化,而是一声巨响 - 突然之间,给定网站的所有网址都会发生变化。
您需要更改设计的视角。 用户将如何看待价格?他们将如何描述产品?在不同的网站上识别完全相同的产品是否重要?这些是您需要设计的关键属性。
您可能需要设计自己的基础架构来识别产品。您可以使用每个供应商的计划(这些通常以SKU为单位 - 库存单位)。或者,您可能使用UPC(通用产品代码)等行业标准方法。