【问题标题】:Is this valid database design or are there too many foreign keys?这是有效的数据库设计还是外键太多?
【发布时间】:2015-03-31 17:28:30
【问题描述】:

假设我有一个销售不同品牌和规格的笔记本电脑的网站。规格包括 CPU 功率、内存、硬盘空间,甚至保险、服务和配件等。

它们都应该可以通过完整搜索文本分面/过滤进行搜索,例如:http://www.pricegrabber.com/computers/laptop/p-13/

数据库是postgresql

无论是否愚蠢,我的计划是为每个规范本身设置一个表格。所以我会为cpus 创建一个表,其中有所有不同的 CPU 选项,例如“Intel 4.33 Ghz 四核”或其他任何东西,并对hard_disksmemoriesvideo_cards、等等。

因此,最后,主表看起来像这样:

class CreateLaptops < ActiveRecord::Migration
  def change
    create_table :laptops do |t|
      t.references :brands_id
      t.references :models_id
      t.references :cpus_id
      t.references :memories_id
      t.references :video_cards_id
      t.references :displays_id
      t.references :batteries_id
      t.references :accessories_id
      t.references :insurances_id
      # and the list goes on ...
      t.timestamps null: false
    end
  end
end

这是愚蠢的设计吗?我知道这可能是基于意见,但我会喜欢任何指针,比如如果我客观地做完全错误的事情。我有点计划更深入,即引用一些东西,而后者又引用了一些东西。例如,cpus 可以拆分为 intel_cpusamd_cpus,但现在我觉得我走得太远了。

最重要的考虑是使其易于从外部搜索,然后使其易于维护和组织,而性能则排在最后,因为数据库中根本不会有很多项目。

期待听到您的想法!

【问题讨论】:

  • 你为什么不使用“文章编号”之类的东西作为主键?有了这样一个数字,您就可以唯一确定每个产品。
  • @SklogW 我想这是自动分配的。除非我误解了你,否则这不是问题的关键。
  • 看看here

标签: ruby-on-rails postgresql database-design


【解决方案1】:

在我看来,您想将资源嵌套很多层,如下所示:

class Laptops < ActiveRecord::Base
  has_many :cpus
end
class CPUs < ActiveRecord::Base
  has_many :intel
  has_many :AMD
end

正如我所假设的“使其可从外部搜索”你的意思是你想让它成为一个好的 RESTful API,想想你必须为第一台笔记本电脑的第一个 CPU 的第一个 AMD 指定什么路线:

example.com/laptops/1/cpus/1/amd/1

或者在您尝试链接到某个特定路径时在内部想象:

link_to laptops_cpus_amd_path

不太可读。而且只有三层深。

你说过你想让所有这些东西都可以通过全文搜索来搜索。这种数据库设计将如何帮助呢? Postgresql 已经可以进行开箱即用的全文搜索,也就是说,如果在您的笔记本电脑表中您有一个值“Intel 4.33 Ghz Quad Core”,PG 可以找到它。将 CPU 抽象为它自己的模型根本无济于事,只会让你的 API 变得更糟。

其实有一篇关于PG全文搜索的优秀Railscast:

http://railscasts.com/episodes/343-full-text-search-in-postgresql

【讨论】:

  • 很少用这样的路径来完成刻面,它从来没有多大意义。对笔记本电脑规格进行全文搜索并没有多大意义,因为您需要输入所有内容,否则会有所不同。 OP 明确指出需要 both,并且分解组件似乎对 faceting 是合理的。
  • 感谢您的回答。无需实际链接到不同的 CPU 或其他任何东西,只需连接到笔记本电脑本身。我知道 postgres 可以开箱即用地进行全文搜索,这正是我正在使用的(嗯,使用 pg_search gem)。如前所述,完全搜索肯定可以找到,但“英特尔 4.33 Ghz 四核”本身将毫无意义,即没有 实际 值,这使得当有人想要时不可能出现例如,列出 4 到 4.5 Ghz 之间的 CPU。
  • @DaveNewton 我可以询问您对我的方法的看法吗?
  • 哦,糟糕,我应该更仔细地阅读您的帖子。刻面不在我的权限范围内。
猜你喜欢
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多