Отношения с МариаДБ

#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. Да, спасибо, я перестраиваю свою модель БД