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