2011-10-30 39 views
0

所以我想要一个用户拥有多个投资组合,而在投资组合中,它可以包含多个股票。它应该像has_many这样的关系一样直截了当。但我也希望用户能够命名投资组合,因为在投资组合模型中,我们将有两列,user_id和stock_id。我应该在哪里将“名称”属性适用于模型?如果我有第三个名为“名称”的列,是不是有点多余?因为,比如用户1拥有包含股票3,4,5的投资组合1。这将包括三个排,像我应该如何设计这种情况下的数据库关系

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

将会有什么更好的解决方案来设计这个关系?

感谢

回答

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

如何愚蠢的我!非常感谢您的帮助!但我认为对于投资组合股票关系,我们可能只是使用has_and_belongs_to_many来避免管理另一个模型所需的额外工作。 – zsljulius

0

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

你应该有一个表给该用户

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

StockID, PortfolioId, stockAttribute1, stockattribute2, ...

在用户表

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

进一步阅读,你可以研究Database normalization

0

用户表

id 

股票表

id | portfolio_id 

组合表

id | user_id | name 

这是组织你的关系的一种方法。每个用户都有很多投资组合,每只股票都属于一个投资组合。这使您可以在用户之间更改投资组合,而无需修改股票数据。

请记住,还有其他方式组织你的关系取决于你认为更重要的。

+1

但是这限制了股票只属于一个投资组合,不是吗? – zsljulius

+0

它的确如此。我承认,我对股票交易并不熟悉,也不知道股票是否属于多个投资组合。 – Huck

2

假设下面的要求...

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

...这个数据库模型应该让你开始:

enter image description here

顺便说一句,这款机型采用自然键的方法。你也可以使用代理键,例如:

enter image description here

每个人都有优点和缺点,但是这是一个不同的主题...

+0

这是真正的亲。我不熟悉自然键或代理键。但我认为你的第二种方法与乔丹相同。给出的图片非常棒,谢谢你的回答 – zsljulius

相关问题