【问题标题】:How can I model this database in order to handle this query如何对此数据库进行建模以处理此查询
【发布时间】:2015-08-15 01:10:24
【问题描述】:

有一个来源提供以下格式的数据,我必须根据这种格式设计表格。我应该保留它们现有的结构还是将它们分成几张表?

第一张桌子:

ItemId     PropertyId      Value

A1           10            Black
A1           20            16gb
A1           30            Iphone6
A1           1000          Apple

属性参考表:

PropetyID     Value

10            Color
20            Memory Size
30            Item Name
100           Product Group

可以有超过 2000 个不同的属性。最后设计的表格应该能够回答以下问题:

How many white iPhones of 16gb were sold?

【问题讨论】:

  • 这看起来像是一道作业题。 StackOverflow 社区不应该做你的功课。
  • 一般来说,将此标记为家庭作业,或提供您所做的一些尝试。
  • EAV 模型使用起来可能很痛苦,但它有它的位置。我认为基本规则是根据数据类型将数据分开,因此日期保存在日期数据类型中,整数保存在 INT 中等。这可以通过根据数据类型将数据分成单独的表来完成。

标签: mysql database database-design normalization


【解决方案1】:

这个设计在我看来不错,因为它没有违反任何明显的规范化规则。此外,这是为了编写您要查找的查询而设计的。

因为我怀疑这是一个家庭作业问题,所以我不会为你编写整个查询,但我会给你一个粗略的指导,你必须将它转换为 SQL。要查找白色 16 GB iPhone:

  • 选择 itemID,其中值 10 等于白色,值 20 等于 16gb,值 30 等于 iPhone。
  • 由于这些条件不能对每一行都成立,因此您需要查询匹配其中一个条件的行(提示:OR 运算符)。
  • 话虽如此,您随后需要找出哪些 itemID 符合所有这三个条件(提示:HAVING 子句)。

一个粗略的骨架:

SELECT items
FROM myTable
WHERE itemIsWhite OR itemIs16gp OR itemIsIphone
GROUP BY item
HAVING threeRowsReturned

如果您遇到任何问题,请随时提出,但我强烈建议您自己尝试,因为我已经为您提供了很多帮助。

【讨论】:

  • 这是一个与数据建模相关的亚马逊面试问题......我很想知道这个问题的答案......答案是雪花表格......我只需要知道我们是如何做到的,因为我没有花时间担任数据建模师
  • @HussainAliMirza 很难说 100%,但如果这些都是列的话,我觉得很好。如果您为在一个表中包含 product, color, size, name, group 列的每个产品创建一行可能会更容易。
  • 真的,我猜这完全取决于上下文。
  • 我实际上告诉他们,如果我们可以为一个属性专用一列...但是他们说他们有 2000 个属性...。在单独的行中有一个属性会让人很难回答像“我卖了多少黑色 16gb Wifi Apple Ipad-Minis”这样的查询......你最终会为 1 个产品拥有 5 个属性
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2013-05-24
  • 2016-07-18
  • 1970-01-01
相关资源
最近更新 更多