<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Mahdi Aghaei</title><link>https://virgool.ir/feed/@mehdi57teh</link><description></description><language>fa</language><pubDate>2026-11-10 19:45:49</pubDate><image><url>https://files.virgool.ir/upload/users/1330256/avatar/avatar.png</url><title>Mahdi Aghaei</title><link>https://virgool.ir/@mehdi57teh</link></image><item><title>یک قابلیت کمتر شناخته‌شده PostgreSQL برای مدیریت بازه‌ها</title><link>https://virgool.ir/@mehdi57teh/یک-قابلیت-کمتر-شناخته-شده-postgresql-برای-مدیریت-بازه-ها-rudck1e4ynwm</link><description>❌ اگر در PostgreSQL هنوز برای ذخیره بازه‌های زمانی از دو ستون start_at و end_at استفاده می‌کنید، شاید وقت آن رسیده با Range Types آشنا شوید.جالب است بدانید این قابلیت از PostgreSQL 9.2 (سال ۲۰۱۲) وجود دارد، اما هنوز هم یکی از ویژگی‌های کمتر شناخته‌شده این دیتابیس محسوب می‌شود.PostgreSQL برای انواع مختلف داده، Range Typeهای آماده‌ای دارد؛ مانند:daterangetsrangetstzrangeint4rangeint8rangenumrangeخیلی از ما این مدل را استفاده می‌کنیم:start_at TIMESTAMP,&#xA;end_at   TIMESTAMP&#xA;اما PostgreSQL نوع داده‌ای دارد که دقیقاً برای همین سناریو طراحی شده است:period TSTZRANGE&#xA;شاید در نگاه اول فقط یک ستون کمتر به نظر برسد، اما مزایای آن بسیار فراتر از این است.1️⃣ جستجوی Overlap بسیار ساده‌تربا دو ستون معمولاً باید این شرط را بنویسید:WHERE start_at &lt; :new_end&#xA;  AND end_at &gt; :new_start&#xA;اما با tstzrange:WHERE period &amp;&amp; tstzrange(:new_start, :new_end)&#xA;اپراتور &amp;&amp; یعنی:آیا این دو بازه با هم هم‌پوشانی دارند؟هم خواناتر است و هم احتمال خطای منطقی کمتر می‌شود.2️⃣ ایندکس بسیار قدرتمندتر برای داده‌های حجیم 🚀اگر جدول شما میلیون‌ها رکورد داشته باشد (مثل رزروها، کمپین‌ها یا قیمت‌ها)، می‌توانید از GiST Index استفاده کنید:CREATE INDEX idx_period&#xA;ON reservations&#xA;USING GIST(period);&#xA;از این به بعد کوئری‌هایی مثل:WHERE period &amp;&amp; tstzrange(...)&#xA;با استفاده از ایندکس اجرا می‌شوند و عملکرد بسیار بهتری نسبت به شرط‌های پیچیده روی دو ستون خواهند داشت.3️⃣ جلوگیری از ثبت بازه‌های متداخل، بدون حتی یک خط کدفرض کنید هیچ دو رزروی برای یک اتاق نباید روی هم بیفتند.با دو ستون معمولاً باید این منطق را در لایه Application پیاده‌سازی کنید.اما PostgreSQL خودش این کار را انجام می‌دهد:ALTER TABLE reservations&#xA;ADD CONSTRAINT no_overlap&#xA;EXCLUDE USING gist (&#xA;    room_id WITH =,&#xA;    period WITH &amp;&amp;&#xA;);&#xA;از این لحظه، اگر کسی بخواهد یک رزرو متداخل ثبت کند، خود دیتابیس جلوی آن را می‌گیرد.4️⃣ اپراتورهای آمادهRange Types مجموعه‌ای از عملگرهای بسیار کاربردی دارد:period @&gt; now()&#xA;آیا این بازه، زمان فعلی را شامل می‌شود؟period &lt;@ other_period&#xA;آیا این بازه داخل بازه دیگری قرار دارد؟lower(period)&#xA;upper(period)&#xA;دریافت شروع و پایان بازه.اگر با داده‌هایی مثل این سروکار دارید:✅ رزرو✅ شیفت کاری✅ اعتبار قیمت✅ کمپین‌های تخفیف✅ بازه ارسال✅ هر چیزی که مفهوم «از ... تا ...» داردبه نظرم daterange، tsrange یا tstzrange ارزش بررسی جدی دارند.گاهی قابلیت‌هایی که سال‌هاست در PostgreSQL وجود دارند، بیشترین تأثیر را روی کیفیت طراحی دیتابیس، خوانایی کوئری‌ها و عملکرد سیستم می‌گذارند.شما از Range Types در پروژه‌هایتان استفاده کرده‌اید؟ تجربه‌تان چه بوده است؟#PostgreSQL #Database #SQL #Backend #SoftwareEngineering #Performance</description><category>Mahdi Aghaei</category><author>Mahdi Aghaei</author><pubDate>Sat, 01 Aug 2026 10:51:20 +0330</pubDate></item></channel></rss>