Разница между HasOne и BelongsTo в Sequelize ORM

Это связано с тем, что sudo pip install numpy никогда не устанавливал numpy в вашем virtualenv. Не использовать sudo использовать

python -m pip install numpy 

После активации вашей виртуальной среды.

29
задан Jaseem Abbas 2 January 2016 в 11:27
поделиться

2 ответа

Это более универсальная проблема.

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

У человека только одна правая рука. Правая рука принадлежит одному человеку.

Сказать обратное выглядит немного странно:

Правая рука имеет мужчину. Мужчина принадлежит правой руке.

Вы можете иметь человека без правой руки. Но одна правая рука бесполезна.

В дальнейшем, если RightArm и Men являются моделями, это может выглядеть следующим образом:

Man.hasOne(RightArm);
RightArm.belongsTo(Man);

И, как вы заметили, есть также разница в структуре таблицы БД:

BelongsTo будет добавить foreignKey к источнику, куда hasOne добавит к цели (Sequelize создает новый столбец «ManId» в таблице «RightArm», но не создает столбец «RightArmId» в таблице «Man»).

Я не вижу больше различий.

51
ответ дан Ionică Bizău 2 January 2016 в 11:27
поделиться

Я согласен с Кшиштофом Штомпкой о разнице между:

Man.hasOne(RightArm);
RightArm.belongsTo(Man);

Я хотел бы ответить на вопрос Янцзюнь Вана :

Итак, в этом случае я должен использовать Man.hasOne(RightArm); или RightArm.belongsTo(Man);? Или использовать их обоих?

Это правда, что отношения Man.hasOne(RightArm); и RightArm.belongsTo(Man); делают одно и то же - каждое из этих отношений добавит внешний ключ manId к RightArm. ] таблица.

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

1147 Так в чем же разница? Основное различие лежит на слое ORM (в нашем случае это Sequalize ORM, но приведенная ниже логика применима к Eloquent ] ORM Ларавела или даже к активной записи Руби ОРМ).

Используя отношение Man.hasOne(RightArm);, мы сможем заполнить человека RightArm, используя модель Man. Если этого достаточно для нашего приложения, мы можем остановиться на этом и не добавлять отношение RightArm.belongsTo(Man); к модели RightArm.

Но что, если нам нужно получить владельца RightArm? Мы не сможем сделать это, используя модель RightArm без определения отношения RightArm.belongsTo(Man); для модели RightArm.

Еще одним примером будут модели User и Phone. Определив отношение User.hasOne(Phone), мы сможем заполнить наши User Phone. Без определения отношения Phone.belongsTo(User) мы не сможем заполнить владельца Phone (например, нашего User). Если мы определим отношение Phone.belongsTo(User), мы сможем получить владельца Phone.

Итак, здесь мы имеем главное отличие: если мы хотим иметь возможность заполнять данные из обеих моделей, нам нужно определить отношения (hasOne и belongsTo) для обеих из них. Если нам достаточно получить, например, только User [1128], но не User Phone, мы можем определить только отношение User.hasOne(Phone) для модели User.

]

Приведенная выше логика применяется ко всем ORM, которые имеют отношения hasOne и belongsTo.

Надеюсь, это прояснит ваше понимание.

36
ответ дан Vladyslav Turak 2 January 2016 в 11:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: