প্রকল্প সম্পর্কে

# RedBase — .NET-এর জন্য টাইপড অবজেক্ট স্টোরেজ RedBase হলো .NET-এর জন্য একটি ডেটা প্ল্যাটফর্ম যা টাইপড অবজেক্টগুলোকে একটি রিলেশনাল ব্যাকএন্ডে (PostgreSQL, Microsoft SQL Server, বা SQLite — এমবেডেড/অফলাইন, Blazor WebAssembly এবং SQLite প্রোভাইডারের মাধ্যমে মোবাইলসহ) সংরক্ষণ করে। আপনি সাধারণ C# ক্লাস হিসেবে স্কিমা সংজ্ঞায়িত করেন — RedBase একটি একক LINQ-স্টাইল API-এর মাধ্যমে স্টোরেজ, ইনডেক্সিং, কোয়েরি, ট্রি, লিস্ট, অ্যাগ্রিগেশন এবং উইন্ডো ফাংশন পরিচালনা করে। কোনো Entity Framework নেই। কোনো মাইগ্রেশন নেই। ৪০টি টেবিলের Include চেইন নেই। শুধু C# ক্লাস এবং সংরক্ষণের জন্য এক লাইন, লোড করার জন্য এক লাইন। ## কেন RedBase - **স্কিমা = C# ক্লাস**: আপনার ক্লাসে একটি প্রপার্টি যোগ করে একটি ফিল্ড যোগ করুন; `SyncSchemeAsync()` বাকিটা সামলায়। কোনো মাইগ্রেশন ফাইল নেই। - **সম্পূর্ণ অবজেক্ট গ্রাফ**: নেস্টেড `RedbObject<T>` রেফারেন্স (একক, অ্যারে, ডিকশনারি) এক কলে সংরক্ষিত ও লোড হয় — কোনো JOIN বা Include চেইন নেই। - **স্ট্রং টাইপিং**: প্রতিটি প্রপার্টি FK কনস্ট্রেইন্ট ও ইনডেক্সসহ একটি ডেডিকেটেড টাইপড কলামে ম্যাপ হয় — JSON ব্লব নয়। SQL স্তরে কোয়েরিযোগ্য। - **বিল্ট-ইন ট্রি**: রিকার্সিভ CTE, ডেপথ, অ্যানসেস্টর এবং পাথ-টু-রুটসহ `TreeQuery<T>()`। - **সমৃদ্ধ কোয়েরি API**: Where ফিল্টার, প্রজেকশন, GroupBy, অ্যাগ্রিগেশন এবং উইন্ডো ফাংশন (ROW_NUMBER, RANK, LAG/LEAD, NTILE, কাস্টম ফ্রেম) সহ সম্পূর্ণ LINQ সমর্থন। - **একাধিক প্রোভাইডার**: PostgreSQL, MSSQL এবং SQLite (Blazor WebAssembly ও মোবাইলের জন্য বিশুদ্ধ C# সহ)। ## দ্রুত শুরু ```csharp // ১. একটি স্কিমা সংজ্ঞায়িত করুন — এটাই আপনার "মাইগ্রেশন" [RedbScheme("Employee")] public class EmployeeProps { public string FirstName { get; set; } = ""; public string LastName { get; set; } = ""; public int Age { get; set; } public decimal Salary { get; set; } public string Department { get; set; } = ""; public string Position { get; set; } = ""; public DateTime HireDate { get; set; } public string[]? Skills { get; set; } public Address? HomeAddress { get; set; } public Dictionary<int, decimal>? BonusByYear { get; set; } } // ২. স্কিমা সিঙ্ক করুন (স্বয়ংক্রিয়ভাবে স্টোরেজ তৈরি করে) await redb.SyncSchemeAsync<EmployeeProps>(); // ৩. সংরক্ষণ করুন var employee = new RedbObject<EmployeeProps> { name = "New Developer", Props = new EmployeeProps { FirstName = "Alice", LastName = "Johnson", Age = 28, Position = "Developer", Department = "Engineering", Salary = 85000m, HireDate = DateTime.Today, Skills = ["C#", "React", "SQL"] } }; await redb.SaveAsync(employee); // ৪. লোড করুন var loaded = await redb.LoadAsync<EmployeeProps>(employee.Id); // ৫. কোয়েরি করুন var results = await redb.Query<EmployeeProps>() .Where(e => e.Salary > 75000m) .OrderByDescending(e => e.Salary) .Take(100) .ToListAsync(); ``` ## প্যাকেজ | প্যাকেজ | বিবরণ | |---------|-------------| | `redb.Core` | কোর অ্যাবস্ট্রাকশন, কোয়েরি বিল্ডার, LINQ প্রোভাইডার | | `redb.Postgres` | PostgreSQL প্রোভাইডার (ফ্রি, Apache 2.0) | | `redb.MSSql` | Microsoft SQL Server প্রোভাইডার (ফ্রি, Apache 2.0) | | `redb.SQLite` | SQLite প্রোভাইডার (ফ্রি, Apache 2.0) — এমবেডেড/অফলাইন, নেটিভ লোডেবল এক্সটেনশন | | `redb.Core.Pro` | Pro এক্সটেনশন: প্যারালাল মেটেরিয়ালাইজেশন, চেঞ্জ ট্র্যাকিং, মাইগ্রেশন | | `redb.Postgres.Pro` | অপ্টিমাইজড কোয়েরি জেনারেশনসহ PostgreSQL Pro প্রোভাইডার | | `redb.MSSql.Pro` | অপ্টিমাইজড কোয়েরি জেনারেশনসহ MSSQL Pro প্রোভাইডার | | `redb.SQLite.Pro` | SQLite Pro প্রোভাইডার — বিশুদ্ধ C# (নেটিভ এক্সটেনশন নেই): Blazor WebAssembly ও মোবাইল | | `redb.Export` | ডেটাবেস এক্সপোর্ট/ইমপোর্ট: ব্যাকআপ, PostgreSQL ↔ MSSQL-এর মধ্যে মাইগ্রেশনের জন্য `.redb` ফাইল (JSONL/ZIP) | ## সক্ষমতা ### CRUD - একক বা ব্যাচ অবজেক্ট সংরক্ষণ - সম্পূর্ণ অবজেক্ট গ্রাফসহ ID দ্বারা লোড - COPY প্রোটোকলের মাধ্যমে বাল্ক ইনসার্ট - ঐচ্ছিক পার্জসহ ডিলিট ### সমৃদ্ধ Props স্ট্রাকচার Props-এ স্কেলার, নেস্টেড ক্লাস, অ্যারে, ডিকশনারি (টাপল কীসহ) এবং `RedbObject` রেফারেন্স থাকতে পারে — নির্বিচারে গভীর। সবই এক কলে সংরক্ষিত ও লোড হয়। ### কোয়েরি বৈশিষ্ট্য - **Where ফিল্টার**: তুলনা, AND/OR/NOT, `WhereIn`, নালেবল চেক, বেস-ফিল্ড ফিল্টার - **স্ট্রিং অপারেশন**: Contains, StartsWith, কেস-ইনসেনসিটিভ (অ-ইংরেজি টেক্সটের জন্য ICU কোলেশন সমর্থনসহ) - **নেস্টেড প্রপার্টি**: যেকোনো গভীরতায় নেস্টেড ক্লাস ফিল্ডে ফিল্টার - **অ্যারে অপারেশন**: এলিমেন্ট Contains, যেকোনো/সব কম্বিনেশন - **ডিকশনারি অপারেশন**: ContainsKey, ইনডেক্সার ফিল্টার, নেস্টেড ভ্যালু - **প্রজেকশন ও পেজিনেশন**: Select, Distinct, OrderBy/ThenBy, Skip/Take, FirstOrDefault - **অ্যাগ্রিগেশন**: Sum, Average, Min/Max, ব্যাচ অ্যাগ্রিগেশন, ফিল্টারড অ্যাগ্রিগেশন - **GroupBy**: একক বা কম্পোজিট কী, অ্যারে এলিমেন্ট গ্রুপিং - **উইন্ডো ফাংশন**: ROW_NUMBER, RANK, DENSE_RANK, রানিং সাম, LAG/LEAD, FIRST/LAST_VALUE, NTILE, কাস্টম ফ্রেম ### ট্রি স্ট্রাকচার ক্লোজার-টেবিল স্টোরেজ এবং রিকার্সিভ CTE-সহ বিল্ট-ইন হায়ারার্কিক্যাল ডেটা: - চাইল্ড নোড তৈরি - ডেপথ লিমিটসহ সম্পূর্ণ ট্রি লোড - চিলড্রেন/ডেসেন্ড্যান্ট পাওয়া - রুট পর্যন্ত পাথ ## ইনস্টলেশন ```bash # PostgreSQL (ফ্রি) dotnet add package redb.Postgres # অথবা MSSQL (ফ্রি) dotnet add package redb.MSSql # Pro — স্বয়ংক্রিয়ভাবে redb.Core.Pro অন্তর্ভুক্ত করে dotnet add package redb.Postgres.Pro # অথবা redb.MSSql.Pro ``` ## সেটআপ ```csharp using redb.Core; using redb.Core.Extensions; using redb.Postgres.Pro.Extensions; var builder = WebApplication.CreateBuilder(args); builder.Services.AddRedbPro(options => options .UsePostgres("Host=localhost;Database=mydb;Username=postgres;Password=pass") .Configure(c => { c.PropsSaveStrategy = PropsSaveStrategy.ChangeTracking; c.EnableLazyReferences = false; c.EnablePropsCache = true; })); var app = builder.Build(); var redb = app.Services.GetRequiredService<IRedbService>(); await redb.InitializeAsync(); await redb.SyncSchemeAsync<EmployeeProps>(); ``` ফ্রি ভার্সন `AddRedbPro`-এর পরিবর্তে `AddRedb` ব্যবহার করে। ## ডেটাবেস সেটআপ অপশন - স্টার্টআপে স্বয়ংক্রিয় (`InitializeAsync(ensureCreated: true)`) - স্পষ্ট কল (`EnsureDatabaseAsync()` + `InitializeAsync()`) - DBA/CI-এর জন্য SQL স্ক্রিপ্ট এক্সপোর্ট (`GetSchemaScript()`) - CLI টুল (`redb init`, `redb schema`) ## ক্লায়েন্ট-সাইড: Blazor WebAssembly ও মোবাইল দুটোই `redb.SQLite.Pro` (বিশুদ্ধ C#)-এ চলে। মোবাইলের জন্য বিশেষ কিছু প্রয়োজন নেই; Blazor WebAssembly-এর জন্য নেটিভ রিলিংক, ম্যানুয়াল ইনিশিয়ালাইজেশন এবং অ্যাপ্লিকেশন-লেভেল পার্সিস্টেন্স প্রয়োজন। ## লাইসেন্স ফ্রি প্যাকেজের জন্য Apache 2.0; Pro প্যাকেজের জন্য লাইসেন্স প্রয়োজন (SQLite.Pro-এর 3.x/4.x লাইনে প্রয়োজন নেই)।