Iniziamo. È gratuito!
o registrati con il tuo indirizzo email
Tech da Mind Map: Tech

1. cache

1.1. کی از دیستریبیوتد کش استفاده می‌کنیم

1.1.1. زمانی که سیستم خیلی بزرگه

1.1.2. زمانی که می‌خوایم سیستم رو به صورت هوریزانتالی اسکیل کنیم چون فقط کافیه سرور جدید اضافه کنیم

1.1.3. زمانی که فالت تالرنس داشته باشیم یعنی اگه یکی از سرورامون از کار افتاد بقیه به کارشون ادامه بدن

1.1.4. زمانی که می‌خوایم یک سرور باتلنک نباشه

1.1.5. زمانی که بخواهیم سیستممون اسکیلبل باشه ولی باید حواسمون به هزینه و نتورک لیتنسی باشد

1.2. چه زمانی از co located کش سرور استفاده می‌کنیم

1.2.1. زمانی که می‌خوایم تو هزینه هامون صرفه‌جویی کنیم

1.2.2. زمانی که سیستم ما کوچیکه و و میشه با انجام دادن این کار low latency داشته باشیم

1.3. مکانیزم ساختن کلید در کشینگ توزیع شده چیست؟

1.3.1. با یک کلاینت لایبرری کلیدها ساخته میشن به طوری که مشخص میشه کش در کدام سرور قرار گرفته است

1.4. ممکش فیچر خاصی نداره و صرفاً برای کش کردن اطلاعات کاربرد داره و خب به تبعش سبکه

1.5. برای اینکه از ارسال ریکوست های پرشمار به دیتابیس در هنگام cold state جلوی گیری کنیم چه راه هایی داریم؟

1.5.1. mutex

1.5.2. سمافور

1.5.2.1. مکانیزمی که تضمین میکنه در لحظه تعداد معینی ریکوست از یک منبع استفاده میشه (با استفاده از chan)

1.6. استراتژی حذف

1.6.1. LFU (Least frequently used)

1.6.1.1. gboard

1.6.2. RFU (Recently frequently used)

1.6.3. LIFO

2. DSA

2.1. تو مسأله ی مرج دو ارایه ی سرت شده که یکیشون از انتها فضای خالی داشت، با روش ۲ pointer از انتها مسأله شد.

2.2. self balanced trees

2.2.1. avl

2.2.2. btree

2.3. graph

2.3.1. matrix or list

2.3.1.1. for dense graph use matrix otherwise use list

3. انواع دیپلویمنت

3.1. canary deployment

3.1.1. تعداد کمی از کاربران به صورت تدریجی.

3.2. green blue deployment

3.2.1. تمام کاربران به یکباره پس از سوئیچ.

4. چک سام چیه؟

4.1. یه جاهایی نیاز داری فقط مطمئن باشی که داده های دریافتی بدون هیچ کم و کاستی دقیقا همون هایی هستن که باید باشن و فقط همین مثلا میخوایم فایل دانلود کنیم - دیتا بین سرویس های مختلف بفرستیم - بک آپ بگیریم ولی اگه بخوای امنیت رو رعایت کنی که مثلا کسی نیومده باشه داده رو دستکاری کرده باشه باید از رمزنگاری استفاده کنی (public key private key) روش هایی که داره مثل بیت پرایتی که میگه مثلا تعداد بیت ها باید فرد باشه یکی اضافه میکنیم و ... در کل این روش زیاد کارامد نیست و برای تغییرات چند بیتی جالب نیست همون md5 کنیم و ... بهتره

5. CDN

5.1. به‌عنوان مثال، وقتی کاربری صفحه‌ای را در اپلیکیشن شما بارگذاری می‌کند، CDN ممکن است فایل‌های تصویری، CSS، یا ویدیوهای آن صفحه را از نزدیک‌ترین سرور به کاربر ارسال کند. اما اطلاعات داینامیک که به‌طور خاص برای هر کاربر یا درخواست تولید می‌شود، مثل داده‌های کاربر از پایگاه داده، معمولاً توسط سرورهای اصلی شما مدیریت می‌شود و در CDN ذخیره نمی‌شود.

5.2. بهبود زمان بارگذاری وب‌سایت

5.3. کاهش هزینه‌های پهنای باند

5.4. افزایش دسترس‌پذیری و پایداری محتوا

6. restful arc

6.1. Do not use verbs in URIs

6.1.1. GET: /books/createNewBook/

6.2. Use plural nouns for resources

6.3. Pay special attention to HTTP status codes

6.4. The HTTP 204 status code, known as “No Content,” means that the server successfully processed the client's request but does not need to return any content

6.5. Do not nest resources

6.5.1. /books?author=Cagan

6.6. Handle trailing slashes gracefully

7. message brokers

7.1. RabbitMQ

7.1.1. انواع exchange

7.1.1.1. direct

7.1.1.1.1. با روتینگ کی مشخص میشه تو کدوم صف بره

7.1.1.2. topic

7.1.1.2.1. با وایلدکارد تاپیک مشخص میشه تو کدوم صف ها بره

7.1.1.2.2. با وایلدکارد تاپیک مشخص میشه تو کدوم صف ها بره

7.1.1.3. fanout

7.1.1.3.1. هیچ فیلتری وجود نداره و به همه ی صف ها میره

7.1.1.4. headers

7.1.1.4.1. نمیدونم

7.1.2. انواع پترن

7.1.2.1. pub/sub

7.1.2.2. RPC (request/reply)

7.1.2.3. Work Queues

7.1.2.4. Broadcast

7.1.2.5. P2P (point to point)

8. sorting

8.1. Patience Sorting

8.1.1. دونه دونه از چپ شروع میکنی و کارت ها رو به صورت ستونی میچینی

8.1.2. شرط چینش اینکه که هر کارت باید از کارت بالاییش کوچیکتر باشه

8.1.3. آخرین کارت هر ستون رو نگاه میکنیم و بررسی میکنیم که آیا کارتی که قراره جایگذاری شه از اون کارت کوچیکتره

8.1.4. اگه ستونی با چنین شرایطی وجود نداشت یه ستون جدید درست میکنی

8.1.5. وقتی ستونی جدید ایجاد میشه آخرین کارت ستون آخر مارک میشه

8.1.6. تعداد ستونی که تشکیل شده میشه طول LIS

8.1.7. در نهایت مارکر ها رو از آخر به اول میخونیم و میشه LIS

9. Why Pass db to Handlers?

9.1. Separation of Concerns: Keep your handlers focused on their task (handling requests), not creating/managing DB connections.

9.2. Reusability: If the handlers take db as a parameter, they can be reused across multiple places or services.

9.3. Testing: You can pass mock db connections for unit tests, making your code easier to test.

9.4. Connection Pooling: Avoid creating a new connection for every request; pass a shared instance.

10. rate limiting

10.1. strategies

10.1.1. Token Bucket

10.1.1.1. amazon

10.1.2. Leaky Bucket

10.1.3. Sliding Window

10.1.4. fixed window

10.2. سطح‌بندی محدودیت‌ها

10.2.1. کاربر مهم و کاربر عادی نباید محدودیت یکسان داشته باشن.

10.2.2. یه کاربر لاگین‌شده می‌تونه درخواست‌های بیشتری نسبت به یه کاربر مهمان بفرسته.

10.3. Rate Limiting روی API Gateway

10.4. ریت لیمیتینگ به‌تنهایی کافی نیست، اونو با CAPTCHA، تحلیل رفتار کاربر و سیستم‌های امنیتی ترکیب کن.

11. bloom filtering

11.1. مثال متصدی و کتابخونه که هر دفعه مجبوره بره بگرده ببینه هست یا نیست

11.2. اگه بخوایم ترو نگتیومون کم شه میتونیم از هش فانکشن های بیشتر استفاده کنیم و فضا رو هم بیشتر کنیم

11.3. عملیات دیلیت امکان پذیر نیست و باید از روش هایی مثل Cuckoo Filter و Counting Bloom Filter (CBF) (More memory usage) و Stable Bloom Filter (SBF) (داده های قدیمی حذف میشن به صورت دوره ای) استفاده کنیم

12. microservices

12.1. ارتباط بین سرویس ها

12.1.1. راه حل

12.1.1.1. grpc

12.1.1.2. message brokers

12.2. کشف سرویس

12.2.1. باید بخونم

12.3. تست و مانیتورینگ سخت

12.4. مدیریت دیتا

12.4.1. ترجیحات

12.4.1.1. هر سرویس دیتابیس مستقل خودش رو داشته باش

12.4.2. سازگاری نهایی (Eventual Consistency)

12.4.3. Event Store (ذخیره‌سازی رویدادها)

12.4.3.1. اگر یک سرویس یک رویداد رو از دست بده یا بخواد داده‌هاش رو دوباره همگام کنه، می‌تونه از Event Store همه رویدادهای قدیمی رو دریافت کنه و وضعیت فعلی خودش رو بازسازی کنه.

12.4.4. Reconciliation

12.4.4.1. اگر ناسازگاری داده‌ها شناسایی شد، از بازپرس (Reconciliation) استفاده کنید تا داده‌ها رو با هم مقایسه و اختلافات رو حل کنید.

12.5. چالش ها

12.5.1. بخوایم یه دیتایی رو از چند تا دیتابیس مختلف بگیریم

12.5.1.1. اگر انعطاف‌پذیری بالا می‌خواهید، GraphQL Gateway مناسبه.

12.5.1.1.1. پیچیدگی در پیاده‌سازی Gateway.

12.5.1.1.2. نیاز به طراحی مناسب برای جلوگیری از درخواست‌های سنگین.

12.5.1.2. اگر سیستم شما تعداد زیادی کوئری بین دیتابیس‌ها داره، Data Replication بهترین گزینه هست

12.5.1.2.1. به‌روزرسانی داده‌ها باید هماهنگ باشه.

12.5.1.2.2. هزینه و پیچیدگی برای نگهداری داده‌های تکراری.

12.5.1.3. اگر به دنبال استقلال کامل سرویس‌ها هستید، Orchestration یا Choreography منطقی‌تره.

12.5.1.3.1. افزایش latency (به دلیل فراخوانی چند سرویس).

12.5.1.3.2. نیاز به کد اضافی برای مدیریت ترکیب داده‌ها.

12.5.1.3.3. تو Choreography از request-reply پترن استفاده میکنیم برای اینکه داده ها رو از consumer های مختلف جمع کنیم و در نهایت ترکیبشون میکنیم و برمیگردونیم

12.6. patterns

12.6.1. SAGA

12.6.1.1. برای مدیریت تراکنش‌های توزیع‌شده

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

12.6.1.3. دو روش داره

12.6.1.3.1. Orchestration

12.6.1.3.2. Choreography

12.6.2. Composition یا API Gateway

12.6.3. CQRS (Command Query Responsibility Segregation)

12.6.3.1. Read Model & Write Model

12.6.3.2. When?

12.6.3.2.1. وقتی تعداد خواندن‌ها خیلی بیشتر از نوشتن‌هاست

12.6.3.2.2. مدل داده‌ای که برای نوشتن طراحی شده، معمولاً برای خواندن کارآمد نیست.

12.6.3.2.3. با جداسازی مدل خواندن، می‌تونی پایگاه داده‌ای بهینه برای کوئری‌ها انتخاب کنی. مثلاً از ElasticSearch برای جستجوی سریع استفاده کنی، درحالی‌که نوشتن‌ها رو روی یک دیتابیس رابطه‌ای انجام می‌دی

12.6.3.2.4. در سیستم‌های پیچیده، جداسازی مسئولیت‌ها باعث ساده‌تر شدن منطق کسب‌وکار می‌شه. چون نیازی نیست در یک بخش هم به خواندن سریع و هم به عملیات نوشتن رسیدگی کنی.

13. CAP

13.1. Consitency

13.1.1. هر کوئری به هر سرور بزنم نتیجه یکسان بگیرم

13.2. Avaailibilty

13.2.1. نود اگه تو حالت نان فیلینگ باشه یا ریکاوری مود نباشه باید بتونه ریسپانس بده

13.3. Partition Networking

13.3.1. اگه یه نود خارج شد بقیه نود ها بتونن کارشون رو ادامه بدن

13.4. CA

13.4.1. رو یه سرور هستیم و اگه سرور خراب نباشه همیشه جواب میده

13.5. CP

13.5.1. وقتی نتورک پارتیشن اتفاق بیفته همه سرور ها به حالت read میشن

13.6. AP

13.6.1. وقتی نتورک پارتیشن اتفاق بیفته همه سرور ها هم چنان read/write هستن

13.7. PACELC

13.7.1. وقتی نتورک پارتیشن اتفاق میفته شما مجبوری بین av و cons یکی رو انتخاب کنی در صورتی که اگه شرایط خوبه باید بین لیتنسی و کانسیستنسی یکی رو انتخاب کنی

13.7.1.1. سیستم ها یا

13.7.1.1.1. pc/ec هستن

13.7.1.1.2. pa/el هستن

14. برخی از اصطلاحات

14.1. floating point error: مشکل ذخیره سازی اعداد اعشاری به صورت باینری در کامپیوتر وقتی پیش میاد که استرینگ رو به فلوت تبدیل میکنی

14.2. ORM: یه روشه که پروگرمر رو از کوئری خام و مستفیم به دیتابیس زدن بی نیاز میکنه

14.2.1. مزایا

14.2.1.1. جلوگیری از sql injection

14.2.1.2. ساده سازی کار با دیتابیس

15. Databases

15.1. Mysql

15.1.1. پارتیشن کردن

15.1.1.1. کی خوبه ازش استفاده کنیم؟

15.1.1.1.1. وقتی جدولت خیلی بزرگه (مثلاً چند میلیون ردیف) و کوئری‌ها کند شدن.

15.1.1.1.2. وقتی جدول‌ها خیلی بزرگ می‌شن، کوئری زدن بهشون ممکنه کند بشه. با پارتیشن‌بندی، کوئری‌ها فقط روی پارتیشن مرتبط اجرا می‌شن.

15.1.1.1.3. وقتی نیاز داری مرتب داده‌های قدیمی رو پاک یا آرشیو کنی.

15.1.1.1.4. وقتی داده‌ها رو مرتباً تقسیم‌بندی‌شده استفاده می‌کنی (مثلاً بر اساس تاریخ، منطقه جغرافیایی، یا دسته‌بندی محصول).

15.1.1.2. کی خوب نیست؟

15.1.1.2.1. وقتی حجم داده‌هات کمه یا نیاز به پارتیشن‌بندی نداری.

15.1.1.2.2. وقتی اکثر کوئری‌هات روی همه داده‌ها اجرا می‌شه و تقسیم‌بندی بی‌فایده‌ست.

15.1.1.3. مزایا

15.1.1.3.1. اگر جدول سفارشات بر اساس تاریخ پارتیشن‌بندی بشه، وقتی دنبال سفارشات ماه دی می‌گردی، فقط روی پارتیشن دی جستجو می‌شه، نه کل جدول.

15.1.1.3.2. می‌تونی هر پارتیشن رو روی دیسک یا سرور جداگانه قرار بدی تا فشار روی یک سیستم کم بشه.

15.1.1.4. معایب

15.1.1.4.1. اگر کوئری‌ای بزنی که داده رو از چندین پارتیشن بخواد، ممکنه کندتر از یک جدول ساده بشه.

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

15.1.2. data types

15.1.2.1. blob

15.1.2.1.1. اگه بخوای فایل رو تو دیتابیس ذخیره کنی

15.1.2.2. CHAR vs VARCHAR

15.1.2.2.1. CHAR 255 VARCHAR 4000

15.1.2.2.2. CHAR is faster than VARCHAR.

15.1.2.2.3. طول ثابت: یعنی اگر شما یک فیلد CHAR(10) تعریف کنید، حتی اگر فقط 5 کاراکتر وارد کنید، MySQL بقیه فضا را با فاصله (Space) پر می‌کند. به عنوان مثال، مقدار Hello در یک فیلد CHAR(10) به صورت Hello ذخیره می‌شود. کاربرد: مناسب برای داده‌هایی که همیشه طول ثابتی دارند، مانند کدهای پستی، کدهای کشور یا کدهای محصول.

15.1.2.2.4. طول متغیر: یعنی اگر شما یک فیلد VARCHAR(10) تعریف کنید و 5 کاراکتر وارد کنید، MySQL فقط 5 کاراکتر را ذخیره می‌کند و بقیه فضا را اشغال نمی‌کند. به عنوان مثال، مقدار Hello در یک فیلد VARCHAR(10) دقیقاً به صورت Hello ذخیره می‌شود. کاربرد: مناسب برای داده‌هایی که طول آن‌ها متغیر است، مانند نام‌ها، توضیحات، آدرس‌ها و مواردی که اندازه‌اشان می‌تواند متفاوت باشد.

15.1.2.3. byte < short < int < long (تا اینجا صحیح) < float < double < decmial < big decimal

15.1.3. noramalization vs denormalization

15.1.3.1. یه جاهایی حتی میشه 1nf رو هم نقض کرد و از set استفاده کرد و همه ی اینا با توجه به شرایطه که تصمیم میگیری چیکار کنی

15.1.4. **Constraints** are the rules that we can apply to the type of data in a table. NOT NULL - UNIQUE - PRIMARY KEY - FOREIGN KEY - CHECK - DEFAULT

15.1.5. clustered and non clustered indicies

15.1.5.1. Non-Clustered Index

15.1.5.1.1. داده‌ها به صورت جداگانه ذخیره می‌شوند و ترتیب فیزیکی جدول را تغییر نمی‌دهد.

15.1.5.1.2. چندین Non-Clustered Index می‌تواند در هر جدول وجود داشته باشد.

15.1.5.1.3. کندتر است زیرا نیاز به Lookup برای دسترسی به داده‌ها دارد.

15.1.5.2. Clustered Index

15.1.5.2.1. داده‌ها در جدول بر اساس این ایندکس مرتب می‌شوند.

15.1.5.2.2. فقط یک Clustered Index در هر جدول مجاز است.

15.1.5.2.3. سریع‌تر است زیرا داده‌ها مرتب هستند.

15.1.6. برای انجام عملیات زمانبندی‌شده می‌توانید از CREATE EVENT استفاده کنید:

15.1.6.1. CREATE EVENT my_event ON SCHEDULE EVERY 1 DAY DO INSERT INTO log_table (log_message) VALUES ('Daily log');

15.1.7. Stored Procedures

15.1.7.1. مزیتش اینه که امنیت میره بالاتر چرا؟ چون مثلا نمیخوای کلاینت به بعضی تیبلا دسترسی پیدا کنه

15.1.7.2. هر بار که اجرا می‌شوند، نیازی به کامپایل مجدد ندارند، بنابراین زمان اجرای آنها سریع‌تر است.

15.1.8. کش کردن کوئری تو نسخه ی 8 به بعد حذف شده

15.1.9. Data Integrity

15.1.9.1. فرض کنید یک پایگاه داده فروشگاه آنلاین دارید. اگر مشتری سفارشی ثبت کند

15.1.9.1.1. مشتری در جدول مشتریان وجود داشته باشد (Referential Integrity).

15.1.9.1.2. شماره سفارش یکتا باشد (Entity Integrity).

15.1.9.1.3. مبلغ سفارش عدد مثبت باشد (Domain Integrity).

15.1.9.1.4. فیلدهای ضروری مانند نام مشتری یا آدرس خالی نباشد(Completeness).

15.1.10. stored procedure => مثل یه فانکشن عمل میکنه که اینپوت میگیره و DML های مختلف انجام میده

15.1.11. sql injection => SELECT * FROM users WHERE username = '' OR '1'='1';

15.1.12. index

15.1.12.1. WHERE، JOIN، ORDER BY و GROUP BY

15.1.12.2. Selectivity(مقدایر یکتا) بالا

15.1.12.3. ایندکس روی ستون‌هایی با مقادیر کوچک‌تر (مثل INT یا VARCHAR(20)) سریع‌تر و بهینه‌تر از TEXT یا BLOB است.

15.1.12.4. حواسمون به فارن کی باشه که تو inodb ایندکس میشه ولی تو پستگرس نه

15.1.12.5. یه جایی فول تکست ایندکس مناسبه که از Inverted Index استفاده میکنه که کلمه های داکیومنت رو جدا میکنه و میگه هر کلمه تو چه داکیومنت هایی ذخیره شده

15.1.12.6. انواع

15.1.12.6.1. B-TREE

15.1.12.6.2. HASH

15.1.12.6.3. FULLTEXT

15.1.12.6.4. SPATIAL Index

15.1.12.6.5. UNIQUE

15.1.12.6.6. COMPOSITE

15.1.12.6.7. CLUSTERED

15.1.12.6.8. GIN و GiST Index

15.1.12.6.9. تصمیم گیری در خصوص ایندکس به نحوه ی استفاده از table مرتبطه و باید ببینیم چه کوئری هایی زده میشه و چه اوپریشن هایی داریم، همچنین میزان اوپریشن رایت و رید هم مهمه

15.1.13. انواع لاک

15.1.14. Explain Analyse

15.1.14.1. دستور رو اجرا میکنه

15.1.14.2. از داخلی ترین شروع میکنیم

15.1.14.3. query planner

15.2. normalization

15.2.1. 1nf

15.2.1.1. هر جدول باید یک مقدار در هر سلول داشته باشد

15.2.2. 2nf

15.2.2.1. همه ستون‌های غیرکلیدی باید به کل کلید اصلی وابسته باشند، نه بخشی از آن.

15.2.2.1.1. اگر یک جدول فاکتور از دو ستون "شماره فاکتور" و "کد محصول" به عنوان کلید اصلی استفاده کند، اما "نام مشتری" فقط به شماره فاکتور وابسته باشد، این نقض ۲NF است.

15.2.3. 3nf

15.2.3.1. هیچ ستون غیرکلیدی نباید به یک ستون غیرکلیدی دیگر وابسته باشد

15.2.3.1.1. اگر یک جدول شامل "کد مشتری"، "نام مشتری" و "آدرس مشتری" باشد، اما "آدرس مشتری" به "نام مشتری" وابسته باشد، این نقض ۳NF است.

15.2.4. 4nf

15.2.4.1. وابستگی چندمقداری نباید وجود داشته باشد (یعنی یک ستون نباید به دو مقدار مستقل وابسته باشد).

15.2.4.1.1. دانشجو دوره مهارت علی ریاضی جاوا علی ریاضی پایتون

15.2.4.2. ۴NF: اگر یک جدول شامل دو مجموعه داده مستقل باشد که به هم ربطی ندارند، آن را به دو جدول جدا تقسیم کن.

15.2.5. 5nf

15.2.5.1. ۵NF: اگر یک جدول را می‌توان بدون از دست دادن اطلاعات به چند جدول کوچک‌تر تقسیم کرد، این کار را انجام بده.

15.3. SQL

15.3.1. isolation levels

15.3.1.1. READ UNCOMMITTED

15.3.1.2. READ COMMITTED

15.3.1.2.1. ترنزکشن دوم تغییرات رو بعد از کامیت شدن میبینه

15.3.1.3. REPEATABLE-READ

15.3.1.3.1. ترنزکشن دوم تغییرات رو نمیبینه حتی اگه ترنزکشن اول کامیت شه

15.3.1.4. SERIALIZABLE

15.3.1.4.1. وقتی دو تا ترنزشکن باز میشن و یکیشون بخواد آپدیت کنه صبر میکنه تا بعدی کامیت شه بعد این کارش رو انجام بده وقتی یه ترنزکشن باز شده و یه تغییراتی میده ولی کامیت نمیکنه ترنزکشن بعدی تو select هم waiting میمونه

15.3.2. WITH RECURSIVE

15.3.2.1. پیدا کردن همه مسیرها از A به شهرهای دیگر.

15.3.2.2. **WITH RECURSIVE** FOO AS ( SELECT ... WHERE City = 'A' UNION ALL SELECT ... JOIN **FOO **... )

15.3.2.3. می‌خواهیم تمامی زیرمجموعه‌های یک مدیر خاص را پیدا کنیم.

15.3.3. diff beween ‘_’ and ‘%’

15.3.3.1. _ : جایگزین یک کاراکتر تکی است.

15.3.3.2. % : جایگزین صفر یا بیشتر از صفر کاراکتر است.

15.3.4. EXCEPT تفریق میکنه EXCEPT ALL به همون تعداد که در دسته ی دوم وجود داره حذف میکنه

15.3.5. delete شرط میگیره ولی truncate نه

15.3.6. INTERSECT وجه مشترک رو میاره

15.3.7. اگه بخوای یه تیبل رو کپی کنی create like میکنیش

15.3.8. Union تکراری ها رو حذف میکنه ولی وقتی Union All میزنی تکراری ها رو هم میاره

15.3.9. window functions

15.3.9.1. similar to an agg func, it performs the ops acrross multiple rows. Unlike an agg func, it doesn't group rows into one single row.

15.3.9.2. FUNCTION() OVER (PARTITION BY column ORDER BY column)

15.3.9.3. SELECT window_function() over (window_nane) FROM ... [HAVING ...] WINDOW window_nane AS (PARTITION BY column ORDER BY column) [ORDER BY ...]

15.3.9.4. we want to compare each product's price with the avg price of that year

15.3.9.5. ROW_NUMBER: پیدا کردن سه حقوق برتر در هر دپارتمان. DENSE_RANK, RANK: رتبه‌بندی فروش در هر منطقه - رتبه‌بندی دانش‌آموزان در یک کلاس SUM: محاسبه جمع کل برای هر گروه AVG: محاسبه میانگین مقادیر برای هر گروه COUNT: تعداد کارمندان در هر دپارتمان LAG: مقایسه یک مقدار با مقدار قبلی - بررسی تغییرات فروش نسبت به ماه قبل LEAD: مقایسه یک مقدار با مقدار بعدی CUMULATIVE SUM (SUM با Frame): جمع تجمعی فروش در هر ماه FIRST_VALUE - LAST_VALUE: پیدا کردن حداقل و حداکثر مقدار - حقوق حداقل و حداکثر در هر دپارتمان CUME_DIST - NTILE - PERCENT_RANK هم برای محاسبات آماری پیشرفتن تفاوت بین ROW_NUMBER() و RANK(): تابع ROW_NUMBER() یک شماره ردیف منحصر به فرد برای هر رکورد در مجموعه نتیجه برمی‌گرداند، اما RANK() رکوردهای مساوی را با همان رتبه رده‌بندی می‌کند و بعد از آن رتبه‌ها را می‌پریزد.

15.4. No Sql Databases

16. ترنزکشن دوم تغییرات رو قبل از کامیت شدن میبینه