لینک کوتاه مطلب : https://hsgar.com/?p=6577

EdgeDB 2.0 | وبلاگ EdgeDB

امروز، درست کمتر از 6 ماه پس از انتشار 1.0 🏁، ما مشتاقیم اعلام کنیم EdgeDB 2.0.

از زمان انتشار 1.0 ما در فوریه، ما 3 نسخه جزئی را در خط 1.x منتشر کرده‌ایم. اختلاف نظر (750 عضو و تعداد اعضا!)، چند هزار ستاره GitHub دیگر جمع کرد و به هزاران کاربر فعال افزایش یافت. ما نمی‌توانیم از این که اوضاع پیش می‌رود خوشحال باشیم – و چیزهای هیجان‌انگیز دیوانه‌کننده‌ای در خط لوله داریم.

بازگشت به 2.0. این نسخه مجموعه ای از ویژگی های جدید را به همراه دارد، از جمله:

بیایید به طور خلاصه در مورد چرایی استفاده از EdgeDB به عنوان پایگاه داده برای پروژه بعدی خود بحث کنیم.

EdgeDB یک پایگاه داده جدید است که مدل رابطه ای را برای از بین بردن عدم تطابق امپدانس رابطه ای شیء گسترش می دهد. این به شما امکان می‌دهد داده‌های خود را به روشی بصری‌تر شی گرا مدل‌سازی و جستجو کنید، در حالی که قابلیت اطمینان و عملکرد مدل رابطه‌ای کلاسیک را حفظ می‌کنید. ما آن را پایگاه داده گراف-رابطه ای می نامیم.

EdgeDB با پل زدن بومی شکاف رابطه‌ای شی، نیاز به ابزارهای اضافی مانند ORM و میان‌افزار برای مدیریت مدل‌سازی داده‌ها، مهاجرت‌ها، پرس و جو و میان‌افزار را از بین می‌برد. اینها در هنگام ساخت برنامه های کاربردی با پایگاه داده سنتی رابطه ای یک ضرورت هستند. EdgeDB لایه های غیر ضروری را از پشته نرم افزار شما حذف می کند، پرس و جوی قدرتمندی را که با ORM ها غیرممکن و با SQL غیر عملی است، فعال می کند و مزایای عملکرد زمان اجرا قابل توجهی را به همراه دارد.

فهرست کامل ویژگی‌های EdgeDB که روی یک نوار کاغذ نازک چاپ شده‌اند، احتمالاً تا ماه و عقب کشیده می‌شوند. اما بیایید برخی از بزرگترین آنها را برشماریم:

طرح واره ای اعلامی

… که به شما امکان می دهد ویژگی های محاسبه شده، وراثت، توابع، محدودیت ها و شاخص های پیچیده و قوانین کنترل دسترسی را بیان کنید.

type User {
  required property email -> str {
    constraint exclusive;
  }
}

type BlogPost {
  required property title -> str;
  required property published -> bool {
    default := false
  };
  link author -> User;

  index on (.title);
}

یک سیستم مهاجرت داخلی

… متشکل از یک برنامه ریز مهاجرت بومی پایگاه داده، ردیابی خودکار تاریخچه مهاجرت، و یک گردش کار مبتنی بر CLI.

$ 
edgedb migration create
Created dbschema/migrations/00001.edgeql
Applied dbschema/migrations/00001.edgeql

یک زبان پرس و جو مدرن و ناب

… که با قدرت بیانی SQL مطابقت دارد و در عین حال ترکیب‌پذیرتر و پرمخاطب‌تر باقی می‌ماند (و حذف JOIN!)

select BlogPost {
  title,
  trimmed_title := str_trim(.title),
  author: {
    email
  }
}
filter not .published

سازنده پرس و جو TypeScript

… که می تواند بیان کند دلخواه EdgeQL پرس و جو می کند و به طور خودکار نوع بازگشت پرس و جو را استنباط می کند.

e.select(e.BlogPost, post => ({
  title: true,
  trimmed_title: e.str_trim(post.title),
  author: {
    email: true
  },
  filter: e.op("not", post.published)
}))

و 100% است متن باز و طراحی شده توسط Postgres در زیر کاپوت.

برای بررسی فلسفی بیشتر انگیزه های ما برای ساختن EdgeDB، اطلاعیه EdgeDB 1.0 ما را بررسی کنید. در ضمن، بیایید در مورد 2.0 صحبت کنیم.

پیشرفت‌های EdgeDB 2.0 همه جنبه‌های پایگاه داده را لمس می‌کنند: سیستم نوع، زبان پرس و جو، کتابخانه‌های مشتری و پروتکل باینری، و تجربه توسعه‌دهنده از ساختن یک برنامه با EdgeDB.

برای لیستی بسیار دقیق از ویژگی‌ها و اصلاحات و دستورالعمل‌های ارتقای پروژه‌های خود به EdgeDB 2.0، به تغییرات نسخه 2.0 مراجعه کنید.

EdgeDB UI یک پنل مدیریت زیبا و غنی است که مستقیماً در تمام نمونه‌های EdgeDB 2.0+ ساخته شده است. با دویدن آن را باز کنید edgedb ui در دایرکتوری پروژه شما، که a باز می شود localhost صفحه در مرورگر پیش فرض شما با:

  • مرورگر و ویرایشگر داده؛

  • یک REPL برای نوشتن و اجرای پرس و جوهای EdgeQL.

  • یک ابزار درون نگری طرحواره با تجسم های متنی و گرافیکی طرحواره.

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

نیازی به گفتن نیست که این تازه آغاز راه است. در نسخه‌های آینده، ما به افزودن ویژگی‌های جدید به رابط کاربری ادامه خواهیم داد، مانند تصویرساز طرح پرس و جو، اسناد داخلی و ابزارهای مدیریتی.

دستور GROUP سطح بالای جدید را می توان برای پارتیشن بندی و تجمیع داده ها استفاده کرد. خروجی از GROUP مجموعه ای از اشیاء است – درست مانند هر چیز قدیمی
SELECT پرس و جو. هر شی نشان دهنده یک گروه است و شامل سه فیلد است:
grouping، key، و elements. در اینجا یک مثال ساده آورده شده است:

db> 
group Movie by .release_year;
{
  {
    key: {release_year: 2016},
    grouping: {'release_year'},
    elements: {
      default::Movie {title: 'Captain America: Civil War'},
      default::Movie {title: 'Doctor Strange'},
    },
  },
  {
    key: {release_year: 2017},
    grouping: {'release_year'},
    elements: {
      default::Movie {title: 'Guardians of the Galaxy Vol. 2'},
      default::Movie {title: 'Spider-Man: Homecoming'},
      default::Movie {title: 'Thor: Ragnarok'},
    },
  },
  ...
}

همچنین می‌توانید با عبارات دلخواه EdgeQL، ویژگی‌های واکشی تودرتو و پیوندها گروه‌بندی کنید elements، و پرس و جوهای تحلیلی پیچیده را با مجموعه های گروه بندی اجرا کنید (سلام CUBE و ROLLUP!). اگرچه قدرت واقعی آن در توانایی آن نهفته است ساختن با بقیه زبان:

db> 
... 
... 
... 
... 
... 
... 
... 
... 
... 
... 
... 
with
  groups := (
    group Movie
    using
      starts_with_vowel := re_test('(?i)^[aeiou]', .title),
    by starts_with_vowel
  )
select groups {
  starts_with_vowel := .key.starts_with_vowel,
  count := count(.elements),
  mean_title_length := math::mean(len(.elements.title))
};
{
  {starts_with_vowel: false, count: 12, mean_title_length: 19.75},
  {starts_with_vowel: true, count: 3, mean_title_length: 19.66},
}

در SQL، GROUP BY یک بند است که در انتهای آن نوشته شده است SELECT
عبارتی که به طور چشمگیری هدف پرس و جو را تغییر می دهد و لیستی از الزامات را تحمیل می کند. (به عنوان مثال، تمام ستون ها به غیر از کلیدهای گروه بندی شده باید فقط به عنوان آرگومان هایی برای تجمیع توابع ارجاع شوند.) در مقابل، نحو EdgeQL اجازه می دهد تا ترکیب پذیری بدون اصطکاک، به آن برتری (😘) نسبت به SQL می دهد.

جریان طرحواره قدرتمند EdgeDB از مجموعه کاملی از انواع داده های اولیه، نحو اشیاء توصیفی، نوع mixins، خصوصیات و پیوندهای محاسبه شده به صورت پویا، محدودیت ها و شاخص های پیچیده، توابع تعریف شده توسط کاربر و موارد دیگر پشتیبانی می کند. این بیش از توانایی ارائه یک مدل داده با هر پیچیدگی است.

با EdgeDB 2.0، ما این را به سطح بعدی می‌بریم. با امنیت در سطح شی شما می توانید منطق کنترل دسترسی برنامه خود را در سطح طرحواره پیاده سازی کنید. EdgeDB به طور شفاف آن را در همه جا اجرا می کند و به عنوان یک منبع واحد از حقیقت در زیرساخت شما عمل می کند.

در عمل، این به معنای اضافه کردن است سیاست های دسترسی به انواع اشیاء شما که مجموعه ای از اشیاء قابل انتخاب، درج، به روز رسانی یا حذف را برای یک نوع خاص محدود می کند. بیایید با یک طرح ساده وبلاگ بدون خط مشی دسترسی شروع کنیم.

type User {
  required property email -> str {
    constraint exclusive;
  };
}

type BlogPost {
  required property title -> str;
  link author -> User;
}

ما می خواهیم یک خط مشی دسترسی اضافه کنیم تا اطمینان حاصل شود که پست ها فقط می توانند توسط آنها به روز شوند author. اما چگونه با پایگاه داده ای که یک کوئری خاص را اجرا می کند ارتباط برقرار کنیم؟

  global current_user -> uuid;

  type User {
    required property email -> str {
      constraint exclusive;
    };
  }

  type BlogPost {
    required property title -> str;
    link author -> User;
  }

الف را اضافه می کنیم متغیر جهانی تماس گرفت current_user. متغیرهای جهانی مکانیسم جدیدی برای تعریف a هستند متن نوشته برای اجرای پرس و جو هنگامی که یک global در طرح شما اعلام شد، می توانید به راحتی از طریق API مشتری یا در REPL یک مقدار برای آن تعیین کنید.

import createClient from 'edgedb';

const client = createClient();

const myApiHandler = async (userId: string) => {
  const scopedClient = client.withGlobals({
    current_user: userId,
  });

  return await scopedClient.query(
    `select global current_user;`
  );
}
import edgedb

client = edgedb.create_client()

async def my_api_handler(user_id):
    scoped_client = client.with_globals({
        'current_user': user_id,
    })

    return await scoped_client.query(
      "select global current_user;"
    )
db> 
... 
set global current_user :=
  (SELECT User FILTER .email = 'elvis@edgedb.com').id;
db> 
select global current_user;
{<uuid>"5b4d1530-0e0b-11ed-ae2a-133197f4faf5"}

کتابخانه‌های مشتری ما متغیرهای سراسری را به طور موثر بسته‌بندی و انتقال می‌دهند و همچنین به طور شفاف ادغام اتصال سمت مشتری و جادوی سطح پروتکل را برای شما انجام می‌دهند.

نکته مهم (و بر خلاف پارامترهای پرس و جو) می توانید به متغیرهای سراسری در هر زمینه ای از جمله در طرحواره خود ارجاع دهید. استفاده کنیم
current_user برای افزودن یک خط مشی دسترسی جدید به BlogPost.

  global current_user -> uuid;

  type User {
    required property email -> str {
      constraint exclusive;
    };
  }

  type BlogPost {
    required property title -> str;
    link author -> User;
    access policy own_posts
       allow all
       using (.author.id ?= global current_user)
  }

جدید سیاست دسترسی نامیده میشود own_posts و آن اجازه می دهد
همه
عملیات-انتخاب، به روز رسانی، درج، حذف- در صورت وجود پست .author.id
دارایی برابر است با ارزش current_user متغیر جهانی

ما در مورد انعطاف پذیری طراحی خط مشی های دسترسی هیجان زده هستیم:

  • سیاست ها می توانند allow یا deny دسترسی به عملیات خاص، از جمله
    select، insert، delete، و update (که می توان آن را به زیر تقسیم کرد update read و update write)

  • را using عبارت می تواند با یک عبارت EdgeQL دلخواه مطابقت داشته باشد.

  • می توانید هر تعداد که دوست دارید خط مشی اضافه کنید.

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

abstract type Temporal {
  required property validity_period -> range<datetime>;

  access policy hide_invalid allow all using (
    contains(.validity_period, datetime_of_transaction())
  )
}

رجوع به مستندات
برای جزئیات بیشتر و مثال

زنگ. Rust رسمی مشتری بالاخره اینجاست! 🎉 در حالی که ما به طور گسترده از Rust استفاده می کنیم (مثلاً CLI ما 100٪ Rust است)، مدتی طول کشید تا طراحی API کتابخانه مشتری را بفهمیم و تنظیم کنیم. با این کار لیست کتابخانه های مشتری شخص اول به 4 مورد می رسد TypeScript، پایتون، و
برو، همراه با بسته های نگهداری شده توسط جامعه برای
.خالص و اکسیر.

پروتکل. پروتکل باینری EdgeDB به نسخه 1.0 رسید و چندین پیشرفت را دریافت کرد:

  • کاملاً بدون حالت: این امکان داشتن چندین جلسه همزمان در یک اتصال و همچنین تونل کردن پروتکل از طریق HTTP را فراهم می کند. تونل زنی HTTP در حال حاضر برای پیاده سازی تجربه REPL در رابط کاربری جدید استفاده می شود و بعداً می تواند برای فعال کردن تجربیات جدید مانند ادغام با محیط هایی مانند Next.js Live.

  • پشتیبانی از متغیرهای جهانی و حالت محلی. پس از اتصال کلاینت ها توصیفگر حالت کامل را دریافت می کنند تا بتوانند مقادیر را برای متغیرهای سراسری و پیکربندی سریالی کنند.

  • جریان تجزیه/اجرای بهینه شده کلاینت ها حتی به ارتباطات رفت و برگشتی کمتری با سرور نیاز دارند که تأخیر را بهبود می بخشد.

توسعه محلی کارآمد EdgeDB 2.0 از فعال‌سازی سوکت برای نمونه‌های توسعه پشتیبانی می‌کند، به این معنی که تا زمانی که واقعاً سعی نکنید از آن استفاده کنید، روی devbox شما اجرا نمی‌شود. و هنگامی که از آن استفاده می کنید، تمام فرآیندهای داخلی به صورت خودکار مقیاس می شوند تا از حداقل منابع استفاده کنند. این کار باعث صرفه جویی در RAM و CPU دستگاه شما می شود و به شما این امکان را می دهد که روی چندین پروژه EdgeDB بدون کاهش سرعت کار کنید.

محدوده ها EdgeDB 2.0 از انواع محدوده‌ای پشتیبانی می‌کند که می‌توانند بازه‌هایی از مقادیر را نشان دهند، مانند مقادیر تاریخ/زمان یا اعداد صحیح 64 بیتی. Range ها تعدادی عملگر و توابع داخلی را پیاده سازی می کنند و از ارسال به JSON و پشتیبان پشتیبانی می کنند.

وقت قرار. API تاریخ/زمان بود بهینه سازی شده است برای ساختن محاسبات در تاریخ محلی و زمان محلی صدا بیشتر. یک نوع cal::date_duration جدید به همراه چندین تابع کمکی جدید اضافه شد.

لیست ادامه دارد، آن را به طور کامل در تغییرات v2 بخوانید!

ما قصد داریم تا 6 ماه دیگر EdgeDB 3.0 را منتشر کنیم. ما به آهنگ انتشار سریع پایبند هستیم زیرا کارهای زیادی وجود دارد که می خواهیم انجام دهیم! در حال حاضر در صدر فهرست کارها:

  • EXPLAIN دستور تجزیه و تحلیل پرس و جوهای EdgeQL.

  • انواع خطاهای قابل تعریف توسط کاربر (استثنا)؛

  • پشتیبانی از splats در اشکال EdgeQL.

  • کنترل دسترسی مبتنی بر نقش؛

  • پشتیبانی از جستجوی متن کامل

آخرین، اما نه کم اهمیت، ما به راه اندازی یک پیش نمایش نزدیک هستیم EdgeDB Cloud، یک سرویس EdgeDB میزبانی شده با مدیریت کامل که امکان چرخش نمونه های آماده تولید را با یک دستور CLI فراهم می کند. در زیر ثبت نام کنید تا اولین نفری باشید که آن را تجربه می کند. 🌤

در ضمن، به ما بپیوندید اختلاف نظر، به ما یک ستاره بدهید GitHubو – مهمتر از همه – برو با EdgeDB چیزی فوق العاده بسازی! ❤️























لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.