Многократные самосвязывающиеся ассоциации SQL «многие ко многим» (Sequelize.js) - PullRequest
0 голосов
/ 19 ноября 2018

просто интересно, правильна ли следующая вещь.

У меня есть таблица User, в которой пользователь может быть покупателем или продавцом.У меня есть таблица Sale для записи товара, проданного / приобретенного пользователем.

В настоящее время я планирую предоставить User исходную схему, которая выглядит следующим образом:

id
user_name
display_name
... (other attrs)

ASale будет иметь начальную схему, подобную этой:

id
product_id
price
... (other relevant attrs)

Часть, о которой я хотел бы спросить, это ассоциации.Есть два способа сделать это из того, что я вижу.Мы могли бы либо установить 2 правила «многие ко многим» для покупателя и продавца соответственно, либо sale принадлежать User дважды, один раз как покупатель и один раз как продавец.Конечное состояние такое же, но я не уверен, какой путь лучше / рекомендуется и почему.

Вариант 1 (в формате Sequelize.js):

User.belongsToMany(User, {
    through: Sale,
    as: 'buyer',
    foreignKey: 'buyer_id',
}

User.belongsToMany(User, {
    through: Sale,
    as: 'seller',
    foreignKey: 'seller_id',
}

Вариант 2:

Sale.belongsTo(User, {
    foreignKey: 'seller_id',
}

Sale.belongsTo(User, {
    foreignKey: 'buyer_id',
}

В итоге обе опции приводят к добавлению столбцов внешнего ключа buyer_id и seller_id к модели Sale.Но какой подход вы бы порекомендовали?И почему?

1 Ответ

0 голосов
/ 19 ноября 2018

Sale - это таблица ассоциаций, которая, помимо прочего, реализует отношение «многие ко многим» между продавцами и покупателями.

id
product_id
price
seller_id
buyer_id
... (other attrs)

Обратите внимание, что таблица Sale обычно используется в OLAP, поэтому она слегка денормализована. В OLTP обычно есть таблицы документов или событий, которые содержат идентификаторы продавца и покупателя в заголовках. * Т.е. 1006 *

orders
----
id
date
seller_id
buyer_id
...

order_items
----
order_id
item_index
product_id
price
qty
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...