عن المشروع

# RedBase — تخزين كائنات مُنمّطة لـ .NET RedBase هي منصة بيانات لـ .NET تخزّن كائنات مُنمّطة في خلفية علائقية (PostgreSQL أو Microsoft SQL Server أو SQLite — بما في ذلك المدمجة/غير المتصلة، وBlazor WebAssembly والجوال عبر مزوّد SQLite). تُعرّف المخططات كأصناف C# عادية — ويتولى RedBase التخزين والفهرسة والاستعلام والأشجار والقوائم والتجميع ودوال النوافذ عبر واجهة برمجة واحدة بنمط LINQ. لا Entity Framework. لا ترحيلات. لا سلاسل Include من 40 جدولاً. مجرد أصناف C# وسطر واحد للحفظ وسطر واحد للتحميل. ## لماذا RedBase - **المخطط = صنف C#**: أضف حقلاً بإضافة خاصية إلى صنفك؛ ويتولى `SyncSchemeAsync()` الباقي. لا ملفات ترحيل. - **مخطط كائن كامل**: تُحفظ مراجع `RedbObject<T>` المتداخلة (مفردة، مصفوفة، قاموس) وتُحمّل في نداء واحد — بلا JOINs أو سلاسل Include. - **كتابة قوية**: كل خاصية تُربط بعمود مُنمّط مخصص مع قيود FK وفهارس — وليست كتل JSON. قابلة للاستعلام على مستوى SQL. - **أشجار مدمجة**: `TreeQuery<T>()` مع CTEs تكراري، والعمق، والأسلاف، والمسار إلى الجذر. - **واجهة استعلام غنية**: دعم LINQ كامل يشمل مرشحات Where والإسقاطات وGroupBy والتجميعات ودوال النوافذ (ROW_NUMBER، RANK، LAG/LEAD، NTILE، إطارات مخصصة). - **مزوّدات متعددة**: PostgreSQL وMSSQL وSQLite (بما في ذلك C# خالص لـ Blazor WebAssembly والجوال). ## البدء السريع ```csharp // 1. عرّف مخططاً — هذا هو "الترحيل" الخاص بك [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; } } // 2. زامن المخطط (ينشئ التخزين تلقائياً) await redb.SyncSchemeAsync<EmployeeProps>(); // 3. احفظ 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); // 4. حمّل var loaded = await redb.LoadAsync<EmployeeProps>(employee.Id); // 5. استعلم 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` | تصدير/استيراد قاعدة البيانات: ملفات `.redb` (JSONL/ZIP) للنسخ الاحتياطي، والترحيل بين PostgreSQL ↔ MSSQL | ## القدرات ### CRUD - حفظ كائنات مفردة أو دفعات - التحميل بالمعرّف مع مخطط الكائن الكامل - الإدراج بالجملة عبر بروتوكول COPY - الحذف مع إمكانية الإزالة النهائية ### بنية Props غنية يمكن أن تحتوي Props على قيم قياسية وأصناف متداخلة ومصفوفات وقواميس (بما في ذلك مفاتيح tuple) ومراجع `RedbObject` — بعمق عشوائي. تُحفظ وتُحمّل جميعها في نداء واحد. ### ميزات الاستعلام - **مرشحات Where**: مقارنات، AND/OR/NOT، `WhereIn`، فحوصات nullable، مرشحات الحقول الأساسية - **عمليات النصوص**: 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، إطارات مخصصة ### بنى الأشجار بيانات هرمية مدمجة مع تخزين جدول الإغلاق وCTEs تكراري: - إنشاء عقد فرعية - تحميل الشجرة الكاملة مع حد العمق - الحصول على الأبناء/الأحفاد - المسار إلى الجذر ## التثبيت ```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>(); ``` النسخة المجانية تستخدم `AddRedb` بدلاً من `AddRedbPro`. ## خيارات إعداد قاعدة البيانات - تلقائي عند بدء التشغيل (`InitializeAsync(ensureCreated: true)`) - نداء صريح (`EnsureDatabaseAsync()` + `InitializeAsync()`) - تصدير سكربت SQL لـ DBA/CI (`GetSchemaScript()`) - أداة CLI (`redb init`، `redb schema`) ## جانب العميل: Blazor WebAssembly والجوال كلاهما يعمل على `redb.SQLite.Pro` (C# خالص). الجوال لا يحتاج شيئاً خاصاً؛ Blazor WebAssembly يتطلب إعادة ربط أصلية وتهيئة يدوية واستمرارية على مستوى التطبيق. ## الترخيص Apache 2.0 للحزم المجانية؛ حزم Pro تتطلب ترخيصاً (غير مطلوب على خطوط 3.x/4.x لـ SQLite.Pro).