Get Started. It's Free
or sign up with your email address
Tech by Mind Map: Tech

1. DSA

1.1. self balanced trees

1.1.1. avl

1.1.2. btree

1.2. graph

1.2.1. matrix or list

1.2.1.1. for dense graph use matrix otherwise use list

1.3. data structure

1.3.1. array

1.3.1.1. lookup **by index:** o(1)

1.3.1.1.1. fixed sized memory allocation

1.3.1.2. insert: o(n)

1.3.1.2.1. expanding

1.3.1.3. delete: o(n)

1.3.1.3.1. shifting

1.3.1.4. for fixed size list is sutible

1.3.2. linked list

1.3.2.1. lookup: o(n)

1.3.2.2. insert: o(n)

1.3.2.2.1. except inserting at first or last

1.3.2.3. delete: o(n)

1.3.2.3.1. except the first

1.3.2.4. common questions

1.3.2.4.1. reverse

1.3.2.4.2. kth from the end inplace

1.3.2.4.3. find the middle

1.3.2.4.4. find a loop

1.3.3. stack

1.3.3.1. common questions

1.3.3.1.1. arithmetic expression

1.3.3.1.2. undo

1.3.3.1.3. reverse strings

1.3.3.1.4. balanced expression

1.3.3.1.5. Implement two stacks in one array (from start and end)

1.3.3.1.6. MinStack

1.3.3.2. LIFO

1.3.3.3. push: o(1)

1.3.3.4. pop: o(1)

1.3.4. queue

1.3.4.1. implemented using

1.3.4.1.1. array (2 pointers)

1.3.4.1.2. two stacks

1.3.4.1.3. linked list

1.3.4.2. priority queue

1.3.4.2.1. array: start from last and relpacing

1.3.4.3. LinkedListQueue

1.3.4.3.1. newItem => q2 prevItems(q1) => q2 q2 <=> q1

1.3.4.4. FIFO

1.3.5. dictionary

1.3.5.1. hash function is determinestic

1.3.5.1.1. put value in an array index which is numeric representation of the dictionary key

1.3.5.1.2. in case of collision

1.3.5.2. common questions

1.3.5.2.1. find first non repeated char

1.3.5.2.2. unique pairs of integers that have difference k

1.3.6. trees

1.3.6.1. usages

1.3.6.1.1. auto completion

1.3.6.1.2. database index

1.3.6.1.3. compression

1.3.6.2. binary trees

1.3.6.2.1. common questions

1.3.6.3. self balanced trees

1.3.6.3.1. avl

1.3.6.3.2. btree

1.3.6.3.3. red black trees

1.3.6.3.4. splay trees

1.3.6.3.5. 2-3 trees

1.3.6.4. perfect trees (balanced trees)

1.3.6.4.1. the hight diff between of left and right each node is less than or equal to 1

1.3.6.4.2. height formula

1.3.6.5. heap

1.3.6.5.1. properties

1.3.6.5.2. usages

1.3.6.5.3. implementation

1.3.6.5.4. time complexity

1.3.6.5.5. interview question

1.4. algorithem

1.4.1. sorting

1.4.1.1. Patience Sorting

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

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

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

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

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

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

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

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

2. CDN

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

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

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

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

3. restful arc

3.1. Do not use verbs in URIs

3.1.1. GET: /books/createNewBook/

3.2. Use plural nouns for resources

3.3. Pay special attention to HTTP status codes

3.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

3.5. Do not nest resources

3.5.1. /books?author=Cagan

3.6. Handle trailing slashes gracefully

4. message brokers

4.1. RabbitMQ

4.1.1. انواع exchange

4.1.1.1. direct

4.1.1.1.1. پیام فقط به Queueهایی میره که Routing Key دقیقاً مطابق باشه.

4.1.1.2. topic

4.1.1.2.1. میشه با pattern (مثل order.* یا user.#) پیام‌ها رو مسیریابی کرد.

4.1.1.3. fanout

4.1.1.3.1. پیام رو به همه‌ی Queueهای متصل می‌فرسته (Broadcast).

4.1.1.4. headers

4.1.1.4.1. بر اساس headerهای پیام، مسیریابی میشه.

4.1.2. انواع پترن

4.1.2.1. pub/sub

4.1.2.2. RPC (request/reply)

4.1.2.2.1. correlation_id

4.1.2.3. Work Queues

4.1.2.4. Broadcast

4.1.2.5. P2P (point to point)

4.1.3. وقتی prefetch رو 1 ست کنیم تا وقتی consumer اکنالج نده کیو بهش اجازه ی برداشتن مسیج رو نمیده

4.1.3.1. چطوری میفهمه ورکر هنوز کانسوم نکرده؟

4.1.3.1.1. وقتی یه worker (مصرف‌کننده) به RabbitMQ وصل میشه، از طریق یه channel این کار رو می‌کنه. RabbitMQ می‌دونه که این channel چند تا پیام تحویل گرفته و کدوم‌هاش هنوز ack نشده‌ن.

4.1.4. اجزا

4.1.4.1. producer

4.1.4.1.1. connection

4.1.5. تو RabbitMQ → اگه ۳ سرویس مختلف بخوان همون پیام رو ببینن، باید ۳ تا Queue تعریف کنی و Exchange پیام رو به هر ۳ تا هدایت کنه. تو Kafka → همه اون ۳ سرویس می‌تونن عضو ۳ Consumer Group جدا باشن و بدون تغییر خاصی، پیام رو از همون Topic بخونن.

4.2. redis

4.3. kafka

5. bloom filtering

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

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

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

6. Why Pass db to Handlers?

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

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

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

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

7. microservices

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

7.1.1. راه حل

7.1.1.1. grpc

7.1.1.1.1. ارتباط بین میکروسرویسا

7.1.1.1.2. به صورت باینری دیتا رو ذخیره میکنه و space efficient تره

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

7.1.1.2. message brokers

7.2. کشف سرویس

7.2.1. باید بخونم

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

7.4. مدیریت دیتا

7.4.1. ترجیحات

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

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

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

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

7.4.4. Reconciliation

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

7.5. چالش ها

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

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

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

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

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

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

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

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

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

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

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

7.6. patterns

7.6.1. SAGA

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

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

7.6.1.3. دو روش داره

7.6.1.3.1. Orchestration

7.6.1.3.2. Choreography

7.6.2. Composition یا API Gateway

7.6.3. CQRS (Command Query Responsibility Segregation)

7.6.3.1. Read Model & Write Model

7.6.3.2. When?

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

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

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

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

8. چک سام چیه؟

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

9. system design

9.1. lsm-tree

9.1.1. Log Structured Merge Table

9.1.2. یه نوع داده ساختاره که تو دیتابیسایی که برای write heavy طراحی شدن استفاده میشه

9.1.3. از چند بخش تشکیل شده

9.1.3.1. memtable (حافظه موقت)

9.1.3.1.1. برای نوشتن استفاده میشه و بعد اینکه ظرفیتش پر شد به شکل سگمنت جدید روی sstable نوشته میشه

9.1.3.1.2. برای خوندن استفاده میشه و اگه پیدا نشد توی sstable دنبالش میگردیم

9.1.3.1.3. از ساختمان داده ی red-black tree استفاده میکنه

9.1.3.2. sstable (حافظه ی دیسک)

9.1.3.2.1. Sorted String Table

9.1.3.2.2. برای خوندن استفاده میشه وقتی که توی memtable نباشه و از آخرین سگمنت شروع میکنیم

9.1.3.2.3. چند تا سگمنت داره

9.1.3.2.4. اگه داده ای پاک شه روی آخرین سگمنت مقدار کلید رو null ذخیره میکنیم و هنگام جستجو متوجه میشیم که این مقدار وجود نداره.

9.1.4. چون write رو روی مموری انجام میده برای نوشتن سریعه

9.1.5. برای سریع تر کردن جستوجو میتونیم از bloom فیلترینگ هم استفاده کنیم

9.1.6. کاساندرا (فیسبوک) و بیگ تیبل (گوگل) ازش استفاده میکنن

9.2. b-tree

9.2.1. هم sql و هم no-sql

9.2.2. read heavy

9.2.3. متوازنه و ارتفاع درخت log n هست

9.2.4. هر گره میتونه تعداد زیادی فرزند داره و هر گره مقدار زیادی مقدار داره

9.2.5. . [30 | 50 | 70] / | | \ [9 | 10 | 20] [31 | 39 | 40] [51 | 59 | 60] [71 | 79 | 81 | 90] / | \ / | \ / | \ / \ [1] [11,19] [21,29] [31] [39] [41,49] [51] [59] [61,69] [71,79] [81,100]

9.2.6. b+tree [30 | 50 | 70] / | | \ [10 | 20] [40] [60] [80 | 90] / | \ / \ / \ / | \ [1,9] [10,11,19] [20,21,29] [30,31,39] [40,41,49] [50,51,59] [60,61,69] [70,71,79] [80,81,100] برگ‌ها به صورت پیوندی: [1,9] <-> [10,11,19] <-> [20,21,29] <-> [30,31,39] <-> [40,41,49] <-> [50,51,59] <-> [60,61,69] <-> [70,71,79] <-> [80,81,100]

9.3. file system

9.3.1. یه دیسک در نظر بگیر

9.3.2. به حلقه ها میگن track

9.3.3. به اسلایس ها میگن sector

9.3.4. به تقاطع ترک و سکتور میگن بلاک

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

9.4. معماری serverless

10. cache

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

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

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

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

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

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

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

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

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

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

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

10.5.1. mutex

10.5.2. سمافور

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

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

10.6.1. LFU (Least frequently used)

10.6.1.1. gboard

10.6.2. LRU (least recently used)

10.6.3. LIFO

10.7. ۸۰ درصد ترافیک روی ۲۰ درصد صفحاته

10.8. چطوری کش کنیم؟

10.8.1. به مساله به شکل کامپوننتی نگاه کنیم

10.8.1.1. کامپوننت a داره از کامپوننت های x,y استفاده میکنه

10.8.1.2. کامپوننت x داره از کامپوننت m,n استفاده میکنه

10.8.1.3. کامپوننت n یه سری اطلاعات دیتابیس رو داره

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

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

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

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

11.2.1. مزایا

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

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

12. Databases

12.1. RDBMS

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

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

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

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

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

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

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

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

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

12.1.1.3. مزایا

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

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

12.1.1.4. معایب

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

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

12.1.2. data types

12.1.2.1. blob

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

12.1.2.2. CHAR vs VARCHAR

12.1.2.2.1. CHAR 255 VARCHAR 4000

12.1.2.2.2. CHAR is faster than VARCHAR.

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

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

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

12.1.3. normalization vs denormalization

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

12.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

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

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

12.1.6. Stored Procedures

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

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

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

12.1.8. Data Integrity

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

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

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

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

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

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

12.1.10. index

12.1.10.1. WHERE، JOIN، ORDER BY و GROUP BY

12.1.10.2. cardinality (مقدایر یکتا) بالا

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

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

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

12.1.10.6. انواع

12.1.10.6.1. B-TREE

12.1.10.6.2. HASH

12.1.10.6.3. FULLTEXT

12.1.10.6.4. SPATIAL Index

12.1.10.6.5. UNIQUE

12.1.10.6.6. cover

12.1.10.6.7. COMPOSITE

12.1.10.6.8. GIN و GiST Index

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

12.1.11. Explain Analyse

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

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

12.1.11.3. query planner

12.2. normalization

12.2.1. 1nf

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

12.2.2. 2nf

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

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

12.2.3. 3nf

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

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

12.2.4. 4nf

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

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

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

12.2.5. 5nf

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

12.3. SQL

12.3.1. isolation levels

12.3.1.1. READ UNCOMMITTED

12.3.1.2. READ COMMITTED

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

12.3.1.3. REPEATABLE-READ

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

12.3.1.4. SERIALIZABLE

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

12.3.2. WITH RECURSIVE

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

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

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

12.3.3. diff beween ‘_’ and ‘%’

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

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

12.3.4. t1:a,a,a,b,b,d t2:a,a,b,z intersect: a,b intersect-all: a,a,b except: d except-all: a,b,d

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

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

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

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

12.3.9. window functions

12.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.

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

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

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

12.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() رکوردهای مساوی را با همان رتبه رده‌بندی می‌کند و بعد از آن رتبه‌ها را می‌پریزد.

12.4. No Sql Databases

12.5. تفاوت ها

12.5.1. mysql

12.5.1.1. بیشتر برای اپلیکیشن‌های وب سبک/متوسط انتخاب می‌شود

12.5.2. postgresql

12.5.2.1. queryهای پیچیده

12.5.2.2. تراکنش ها دقیق

12.5.2.3. برای سیستم‌های مالی، تحلیلی، GIS، و پروژه‌های enterprise-level

12.5.3. mariadb

12.5.3.1. cache query

12.5.4. sqlite

12.5.5. چرا دیسکورد از مونگو سوییج کرد رو کاساندرا؟

12.5.5.1. کاساندرا رایت هویه

12.5.5.2. کاساندرا راحت تر اسکیل اوت میشه چون با کانسیستنت هشینگ ساخته شده در حالی که مونگو روی rebalanceing که برای شاردینگ انجام میشه اذیت میکنه

13. redis

13.1. usages

13.1.1. autocompletion

13.1.2. vector databases

13.1.3. various data structures like geo locations

13.1.4. single core

13.1.5. global lock

13.1.5.1. فروش محصول

13.2. cons

13.2.1. limitation

13.2.1.1. ram is expensive

13.3. types

13.3.1. string

13.3.1.1. SET x y

13.3.1.1.1. SET user:13:name ali

13.3.1.2. GET x

13.3.1.3. INCRBY x -3

13.3.1.4. GETSET x

13.3.1.4.1. برای گلوبال لاک

13.3.1.5. به جای get set بهتره mget و mset بزنی که نتورک لیتنسی ریسپانس تایم رو کم نکنه

13.3.1.5.1. MGET x x1 x2

13.3.1.5.2. MSET x y x1 y1 x2 y2

13.3.2. hash

13.3.2.1. HSET x name foo age 21

13.3.2.2. get

13.3.2.2.1. HGET x name

13.3.2.2.2. HGETALL x

13.3.2.2.3. HMGET xx name age

13.3.3. set

13.3.3.1. SADD meat berger kabab pizza SADD irani kabab jujeh

13.3.3.2. SISMEMBER irani jujeh

13.3.3.2.1. o(1)

13.3.3.3. SMEMBERS irani

13.3.3.4. SINTER irani meat kabab

13.3.4. list

13.3.4.1. جای ربیت و کافکا

13.3.4.1.1. Blpop

13.3.4.2. LPUSH x 1 2 3 4

13.3.4.3. LRANGE x 0 -1

13.3.4.4. queue

13.3.4.4.1. lpush rpop

13.3.4.5. stack

13.3.4.5.1. lpush lpop

13.3.5. sorted set

13.3.5.1. ستی که میشه به آیتم هاش وزن داد

13.3.5.2. ZADD x 4 ali 2 reza 3 hasan

13.3.5.3. ZRANGE x 0 2

13.3.5.3.1. reza, hasan

13.3.5.4. ZREVANGE x 0 2

13.3.5.4.1. ali, hasan

13.3.5.5. leaderboard

13.3.5.5.1. o(n)

13.3.5.6. آیتم ها تو کتگوری های مختلف وزن/امتیاز/نمره ی مختلف دارن

13.3.5.6.1. ما میگیم آیتم هایی که تو کتگوری های مشخص شده ی ما در مجموع امتیاز بهتری/بدتری دارن کدومان

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

13.3.6. streaming

13.3.6.1. XADD ,...

14. click house

14.1. column based

14.1.1. نیاز نیست ستون هایی که نیاز نداره رو تو مموریش نگه داره

14.2. space efficient

14.2.1. using comperssion

14.3. primary index

14.3.1. می‌شه گفت پرایمری ایندکس توی ClickHouse شبیه پرایمری ایندکس توی RDBMS هست، با این تفاوت که به‌جای ایندکس‌کردن رکورد به رکورد، روی مجموعه‌ای از رکوردها (بلوک‌ها یا granuleها) ایندکس می‌سازه.

14.4. sparse index

14.4.1. از هر بلوک، یه رکورد نماینده (مثلاً مینیمم کلید) رو ایندکس می‌کنه تا بفهمه اون بلوک به درد query می‌خوره یا نه.

14.5. skip index

14.5.1. Skip index معمولاً خلاصه‌ای (summary) از مقادیر هر بلوک داده نگه می‌داره. مثلاً: min، max، یا یه Bloom filter از مقادیر ستون.

14.6. vectorized exection

14.6.1. ستون رو میشکنه و با چند تا پروسسور کارشو انجام بده

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

15.1. canary deployment

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

15.2. green blue deployment

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