Как я должен спроектировать связь с базой данных в этой ситуации

#mysql #ruby-on-rails #database

#mysql #ruby-on-rails #База данных

Вопрос:

Итак, я хочу, чтобы у пользователя было несколько портфелей, а в портфеле он может содержать несколько акций. Это должно быть так же просто, как отношение has_many though . Но я также хочу, чтобы пользователь мог называть портфели, поскольку в модели портфеля у нас будет два столбца: user_id и stock_id. Где я должен поместить атрибут «name» в модель? если у меня есть третий столбец с именем «name», не будет ли это излишним? Потому что, скажем, у пользователя 1 есть портфель 1, который содержит акции 3,4,5. Это будет состоять из трех строк, например

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

Каким будет лучшее решение для проектирования этих отношений?

Спасибо

Ответ №1:

Похоже, что ваша модель портфолио неправильно названа. На мой взгляд, ваши модели должны выглядеть примерно так:

 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, чтобы избежать дополнительной работы, необходимой для управления другой моделью.

Ответ №2:

Предполагая следующие требования…

  • У каждого портфеля должно быть имя.
  • Имена портфелей уникальны на уровне пользователя (но не глобально: два портфеля могут иметь одинаковое имя, если они принадлежат разным пользователям).
  • Одна акция может быть в нескольких портфелях.

… эта модель базы данных должна помочь вам начать:

введите описание изображения здесь

Кстати, в этой модели используется подход с использованием естественных ключей. Вы также можете использовать суррогатные ключи, например:

введите описание изображения здесь

У каждого есть свои плюсы и минусы, но это другая тема…

Комментарии:

1. Это настоящий профессионал. Я не знаком с естественными ключами или суррогатными ключами. Но я думаю, что ваш второй подход такой же, как у Джордана. Приведенные фотографии довольно потрясающие, спасибо за ответ

Ответ №3:

Таблица пользователя

 id 
 

Таблица запасов

 id | portfolio_id
 

Таблица портфолио

 id | user_id | name
 

Это один из способов организовать ваши отношения. У каждого пользователя много портфелей, и каждая акция принадлежит одному портфелю. Это дает вам возможность изменять портфели между пользователями без необходимости изменять данные о запасах.

Имейте в виду, что существуют другие способы организации ваших отношений в зависимости от того, что вы считаете более важным.

Комментарии:

1. Но это ограничивает принадлежность акций только к одному портфелю, не так ли?

2. Это так. Я признаю, что я совсем не знаком с биржевой торговлей и не знаю, будут ли акции когда-либо принадлежать нескольким портфелям.

Ответ №4:

Из вашего описания: пользователь должен иметь несколько портфелей, а в портфеле он может содержать несколько акций

у вас должна быть одна таблица для пользователя

UserID, UserAttribute1, UserAttribute2, ... одна таблица для портфелей PortfolioID, UserID, portfolioAttribute1, portfolioAttribute2, ... и одна таблица для акций.

StockID, PortfolioId, stockAttribute1, stockattribute2, ...

в таблице user идентификатор пользователя является первичным ключом. в таблице portfolioid portfolioID является первичным ключом, а идентификатор пользователя является внешним ключом, поэтому вы можете связать портфели с пользователями.

для дальнейшего чтения вы можете изучить нормализацию базы данных