ویرگول
ورودثبت نام
محمد حسین خداخواه
محمد حسین خداخواهwhat can i say i am just a backend developer
محمد حسین خداخواه
محمد حسین خداخواه
خواندن ۳ دقیقه·۱ سال پیش

tree Entities in typeOrm

سلام، گاهی اوقات ما یه سری مدل دیتای تودرتو و درختی داریم . . .چطوری اینارو بکنیم تو هم سیو کنیم؟؟؟

توی مونگو دیبی خیلی راحته این کار اما میخام در مورد دیتا بیس های sql صحبت کنم مثل postgresql.و البته orm خفن typeOrm و treeEntity توش.

======================================================================

خب استفاده از tree entity در کل وقتی مفیده که نیاز به مدل سازی ساختار داده های تودرتو و یا درختی باشه.

مثل نمودار های سازمانی


سلسله مراتب دسته ها (به عنوان مثال، دسته های محصول)


رشته های نظر (نظرات تودرتو)


سیستم های فایل (پوشه ها و زیر پوشه ها)


ساختارهای منو

و ازین دسته دیتا ها . . .

کلا typeorm با استفاده از الگو های Adjacency List, Closure Table, and Nested Set ساختار درختی هارو پشتیبانی میکنه.

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


=======================================================================

یه گریز ریز بزنیم به این الگو ها :

Adjacency List :

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

مشکلش هم دقیقا از همینجا میاد که اگر عمق درخت زیاد بشه ممکنه کند عمل کنه.

مثال این adjacency list رو ببینیم با هم:

import { Entity, Tree, TreeChildren, TreeParent, TreeLevelColumn } from 'typeorm'; @Entity() @Tree('adjacency-list') // Use Adjacency List pattern export class Category { @TreeChildren() children: Category[]; @TreeParent() parent: Category; @TreeLevelColumn() level: number; // Automatically tracks the depth of the node }



Closure Table :

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

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

خب بریم مثال پیاده سازیشو ببینیم . . .

import { Entity, Tree, TreeChildren, TreeParent, TreeLevelColumn } from 'typeorm'; @Entity() @Tree('closure-table') // Use Closure Table pattern export class Category { @TreeChildren() children: Category[]; @TreeParent() parent: Category; @TreeLevelColumn() level: number; // Automatically tracks the depth of the node }

Nested Set:

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

مثالشو ببینیم :

import { Entity, Tree, TreeChildren, TreeParent, TreeLevelColumn } from 'typeorm'; @Entity() @Tree('nested-set') // Use Nested Set pattern export class Category { @TreeChildren() children: Category[]; @TreeParent() parent: Category; @TreeLevelColumn() level: number; // Automatically tracks the depth of the node }


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

معمولا به دلایلی استفاده میکنیم به عنوان مثال به خاطر کارآمدی(efficiently) کویری هایی که به دیتاهایی با ساختار درختی میزنیم.

همچنین به دلیل مدیریت ساده تر روابط سلسه مراتبی دیتاها

همچنین انعطاف پذیری (flexibility)

چقد دیگه دلیل میخاین؟؟؟اصن همین که فکر کنید به ی دیتا با ساختار تودرتو بعد اینو در نظر بگیرید خودتون متوجه میشید دیگه.

نتیجه گیری :

انتیتی های درختی در TypeORM مدیریت داده های سلسله مراتبی را ساده می کنند و قابلیت های جستجوی کارآمدی را ارائه می دهند. با انتخاب الگوی درخت مناسب (فهرست مجاورت، جدول بسته یا مجموعه تودرتو)، می توانید برنامه خود را برای عملکرد و مقیاس پذیری بهینه کنید.

۱
۰
محمد حسین خداخواه
محمد حسین خداخواه
what can i say i am just a backend developer
شاید از این پست‌ها خوشتان بیاید