برنامه نویسی

هفته 0: سرور جدید NOTR – انتقال داده ها از MongoDB به PostgreSQL

معرفی

در هفته 0 تغییر سرورم برای Neat on the Rocks، من روی انتقال بخشی از داده هایم از MongoDB (یک پایگاه داده غیر رابطه ای) به PostgreSQL (یک پایگاه داده رابطه ای) تمرکز کردم. این انتقال بسیار مهم است زیرا هدف من استفاده از قابلیت‌های جستجوی قوی SQL برای جستجوهای پیچیده در پایگاه داده کوکتل خود است، در حالی که یک پایگاه داده غیرمرتبط برای ویژگی‌های رسانه اجتماعی برنامه حفظ می‌کنم.

ایجاد مدل ها

من با راه اندازی مدل های Sequelize برای PostgreSQL شروع کردم. این برای اطمینان از یکپارچگی داده ها و ایجاد روابطی که برای بخش پایگاه داده رابطه ای پشته من ضروری است، ضروری بود. در اینجا نحوه تعریف من است Cocktail مدل:


const { Model, DataTypes } = require('sequelize');

module.exports = (sequelize, DataTypes) => {
    class Cocktail extends Model {}

    Cocktail.init({
        name: DataTypes.STRING,
        description: DataTypes.STRING,
        glasswareId: DataTypes.INTEGER,
        imageUrl: DataTypes.STRING,
        techniqueId: DataTypes.INTEGER,
        garnishId: DataTypes.INTEGER
    }, {
        sequelize,
        modelName: 'Cocktail'
    });

    Cocktail.associate = models => {
        Cocktail.belongsTo(models.Glassware, { foreignKey: 'glasswareId' });
        Cocktail.belongsTo(models.Technique, { foreignKey: 'techniqueId' });
        Cocktail.belongsTo(models.Garnish, { foreignKey: 'garnishId' });
    };

    return Cocktail;
};

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

خط لوله تجمع

به دلیل فرمت بدون ساختار داده های MongoDB من، مجبور شدم آن را برای یک پایگاه داده رابطه ای آماده کنم، بنابراین از خط لوله جمع آوری MongoDB برای ایجاد ردیف هایی برای داده های خود استفاده کردم.

db.cocktails.aggregate([
  { $unwind: "$specs" },
  { $project: {
    id: "$_id",
    cocktailName: "$name",
    spirit: "$specs.spirit",
    ounces: {
      $cond: {
        if: { $ifNull: ["$specs.ounces", false] },
        then: "$specs.ounces",
        else: "N/A"
      }
    }
  }}
]);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این به من اجازه داد چندین کوکتل با ساختاری مانند این مصرف کنم:

{
  "_id": {
    "$oid": "1"
  },
  "name": "Old Fashioned",
  "image": {
    "filePath": "https://images.unsplash.com/photo-1470337458703-46ad1756a187?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1169&q=80"
  },
  "specs": [
    {
      "spirit": "Bourbon (80 proof)",
      "ounces": 2
    },
    {
      "spirit": "Simple syrup (1:1)",
      "ounces": 0.5
    },
    {
      "spirit": "Angostura bitters",
      "dashes": 2
    }
  ],
  "instructions": [
    "Fill the mixing glass with ice cubes.",
    "Pour in the cocktail ingredients.",
    "Stir for 30 seconds",
    "Use a strainer to pour into a glass.",
    "Add garnishes and Enjoy!"
  ],
  "description": "Indulge in the distinguished charm of an Old Fashioned cocktail. Crafted with the utmost reverence for tradition, this timeless concoction marries the deep notes of whiskey with the delicate sweetness of muddled sugar. Aromatic bitters add a touch of complexity, while a citrus twist imparts a subtle brightness. Served over a single large ice cube, the Old Fashioned beckons with sophistication. Garnished with an orange twist or a maraschino cherry, it stands as an ode to the classic art of mixology.",
  "method": "Stirred",
  "garnish": "Orange Peel",
  "type": "cocktail",
  "glass": "Rocks",
  "__v": 0
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و مشخصات هر کوکتل را استخراج کنید تا هر شاخص از آرایه مشخصات هر کوکتل به یک ستون در جدول مشخصات من تبدیل شود.

نتیجه

پس از یادگیری طراحی سیستم، این چیزی است که مدتی است می‌خواهم پیاده‌سازی کنم، اما برای انتقال از یک DB غیر رابطه‌ای به یک DB رابطه‌ای در Node تردید داشتم. خیلی هم بد نبود من همچنان از مزایای یک DB غیرمرتبط در پروژه برای جنبه رسانه های اجتماعی استفاده خواهم کرد.

نوشته های مشابه

همچنین ببینید
بستن
دکمه بازگشت به بالا