【问题标题】:How should I design this database?我应该如何设计这个数据库?
【发布时间】:2016-02-19 14:28:48
【问题描述】:

假设我有 1000 万个产品名称,例如iPhone 6。对于每个产品名称,可能有多个 cmet 或评论。当用户搜索产品名称时,它会显示它的所有 cmets。我应该使用两张表来满足这个要求吗?

表一:ProductName,只有一列,“prodName” 表二:评论,只有一列,“cmets”

这两者有什么关系?我是数据库设计的新手,将使用 MySql 来做到这一点,Java 中的 Hibernate。我正在考虑让它尽可能简单,开始。

谢谢。

【问题讨论】:

  • 1000 万件产品,您想保持简单吗?这是一个错误。第一次设计正确。为此,您应该只在每个表中拥有一次信息。除了将表连接在一起的 ID 之外,没有任何重复。
  • 也许您可以考虑迁移到 大数据 架构,例如使用 NoSQL 数据库,例如 MongoDB。
  • 只要做一些简单但快速有效的事情:将product_id 映射到评论表,这样您的产品就可以拥有任意数量的 cmets,但会与一个产品相关。

标签: mysql database hibernate


【解决方案1】:

如果您要为产品信息和该产品的 cmets 保留一个表格,则需要为每个评论复制产品名称。当必须存储可能非常危险的 1000 万件产品时。

另一个问题是表的可扩展性。假设您要添加除名称之外的其他信息,该信息与产品(即库存)密切相关。您不希望根据为该产品制作的 cmets 在表中复制该信息。

为避免此类问题,您可以考虑类似以下的架构:http://sqlfiddle.com/#!9/b50a8/2,将您的表与其键相关联并避免信息重复。

【讨论】:

  • SQLFiddle,太棒了!很好的建议!
  • 用一张表保存1000万个产品名称,用1000万张表保存每个产品的cmets怎么样?与两表设计相比,这是否提供了更好的性能?
  • @martin,它实际上提供了一个更糟糕的解决方案。为什么您的数据库中会无缘无故地重复信息?
  • 谢谢。我认为每个产品的每个评论表都比一个巨大的评论表小得多。这在查找中可能更有效。
  • @martin 可以这样想:每个表都需要一些内存开销来存储其定义(它存储的数据类型、列名、字符编码等)。这通常不是您应该担心的事情:您可以在一个模式中拥有数百个表,并且您的服务器不会出汗。您的建议是为每个评论实例都设置开销;基本上每个表的开销将大于它存储的内容!这绝对不是个好主意!查找效率低下是真的,但这是次要问题。
猜你喜欢
  • 2017-10-04
  • 2011-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
  • 2013-07-09
相关资源
最近更新 更多