在这种情况下我应该如何设计数据库关系

时间:2011-10-30 23:17:02

标签: mysql ruby-on-rails database

所以我希望用户拥有多个投资组合,而在投资组合中,它可以包含多个股票。它应该像has_many虽然关系一样直截了当。但我也希望用户能够命名投资组合,因为在投资组合模型中,我们将有两列,user_id和stock_id。我应该在哪里将“name”属性放入模型中?如果我有一个名为“名字”的第三栏,那不是多余的吗?因为,用户1的投资组合1包含股票3,4,5。这将包含三行,如

 user_id | stock_id | name
---------+----------+------------
       1 |        3 | portfolio1
       1 |        4 | portfolio1
       1 |        5 | portfolio1

设计这种关系的更好解决方案是什么?

由于

4 个答案:

答案 0 :(得分:2)

您的投资组合模型似乎名不副实。在我看来,你的模型看起来应该更像这样:

class User < ActiveRecord::Base
  has_many :portfolios
end

class Portfolio < ActiveRecord::Base
  belongs_to :user
  has_many :stocks, :through => :portfolios_stocks # join table

  # has the `name` attribute
end

class Stock < ActiveRecord::Base
  has_many :portfolios, :through => :portfolios_stocks
end

答案 1 :(得分:2)

假设有以下要求......

  • 每个投资组合都必须命名。
  • 投资组合名称在用户级别是唯一的(但不是全局的:如果两个投资组合属于不同的用户,则它们可以具有相同的名称)。
  • 一只股票可以在多个投资组合中。

...这个数据库模型应该让你入门:

enter image description here

BTW,这个模型使用自然键方法。您也可以使用代理键,例如:

enter image description here

每个都有利有弊,但这是一个不同的主题......

答案 2 :(得分:0)

从您的描述:用户拥有多个投资组合,在投资组合中,它可以包含多个股票

你应该为用户提供一个表

UserID, UserAttribute1, UserAttribute2, ... 投资组合的一个表 PortfolioID, UserID, portfolioAttribute1, portfolioAttribute2, ... 和一张股票表。

StockID, PortfolioId, stockAttribute1, stockattribute2, ...

在用户表中,userID是主键。在投资组合表中,portfolioID是主键,UserID是外键,因此您可以将投资组合链接回用户。

如需进一步阅读,您可以研究Database normalization

答案 3 :(得分:0)

用户表

id 

股票表

id | portfolio_id

投资组合表

id | user_id | name

这是组织关系的一种方式。每个用户都有许多投资组合,每个股票属于一个投资组合。这使您能够在不必修改库存数据的情况下更改用户之间的投资组合。

请记住,根据您认为更重要的内容,还有其他组织关系的方式。