#node.js #typescript #mariadb #sequelize.js
Вопрос:
Я действительно не понимаю, как работает последовательность ассоциаций. У меня есть база данных MariaDB с двумя таблицами: communes и code_postals.
code_commune—это городской код и почтовый почтовый код. Таким образом, город может иметь несколько почтовых кодов, и несколько городов могут использовать один и тот же почтовый код.
Мой запрос SLQ должен быть примерно таким :
SELECT * FROM code_postals P INNER JOIN communes C ON P.code_commune=C.code_commune;
В моем классе хранилища данных TypeScript у меня есть этот код:
const Communes = await this.db.define('commune', {
code_commune: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
libelle_commune: {
type: DataTypes.STRING,
allowNull: false
}
});
const Postal = await this.db.define('code_postal', {
code_commune: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
code_postal: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
}
});
// Define the relationship between the both tables
Postal.hasOne(Communes,{foreignKey: 'code_commune'});
Communes.belongsTo(Postal);
return await Postal.findAll({include: Communes}).then((communes:any)=>{
return communes;
}).catch((e:any)=>{console.error(e);return false;});
Я действительно не понимаю документ, различия между методами hasOne, belongsTo, belongsToMany и т. Д. И не знаю, как сделать этот запрос на ассоциацию.
помоги мне, пожалуйста
Комментарии:
1. Во-первых, Sequelize не поддерживает составные первичные ключи, поэтому вам необходимо добавить столбец суррогатного первичного ключа (автоматически сгенерированный) или использовать существующий столбец с уникальными значениями (если они у вас есть). И во-вторых, пожалуйста, укажите, какая таблица 1 и какая таблица N (я имею в виду соотношение 1:N или N:1).
2. привет, Анатолий! Хорошо для пк. Обе таблицы равны 1:N, вы можете проверить shcema. Город может иметь несколько почтовых индексов, и почтовый индекс может указывать на несколько городов. Например, у Парижа есть 20 почтовых индексов : от 75001 до 75020, потому что это большой город. Фондет, Люин, Перани и Сент-Этьен-де-Шиньи имеют одинаковый почтовый индекс : 37230
Ответ №1:
Если определенный город может иметь несколько почтовых индексов и в то же время определенный почтовый индекс может быть одинаковым для нескольких городов, то у вас есть соотношение M:N между городами и почтовыми индексами, и вам нужна третья таблица соединений, например CommunesPostalCodes
:
const Communes = await this.db.define('commune', {
code_commune: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
},
libelle_commune: {
type: DataTypes.STRING,
allowNull: false
}
});
const Postal = await this.db.define('code_postal', {
code_postal: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true
}
});
const CommunePostal = await this.db.define('commune_postal', {
id: {
type: DataTypes.SERIAL,
allowNull: false,
primaryKey: true,
autoIncrement: true
},
code_commune: {
type: DataTypes.INTEGER,
allowNull: false
},
code_postal: {
type: DataTypes.INTEGER,
allowNull: false
}
});
// Define the relationship between the both tables
Postal.belongsToMany(Communes,{ through: CommunePostal, foreignKey: 'code_postal', otherKey: 'code_commune'});
Communes.belongsToMany(Postal,{ through: CommunePostal, foreignKey: 'code_commune', otherKey: 'code_postal'});
Комментарии:
1. Да, спасибо, я перестраиваю свою модель БД