عن المشروع
# 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).
Comments
0 people shared their preference · Deer Point appears after 10 participants
Sign in to join the discussion.