سلام.
بحث خیلی جالبیه.
من شخصاً تا الان یک روش رو بیشتر استفاده نکردم.ولی یک روش دیگه هم دارم که چند ماهه draft هست و هنوز کامل عملی نشده.
روشی که الان استفاده میکنم:
همه ی جداول ه database دارای ستون ه Guid هستن.
دو تا جدول دارم با این ساختار:
Attribute:
Guid UniqueIdentifier//even this table
name nvarchar
RowAttribute:
Guid uniqueIdentifier
AttributeGuid uniqueIdentifier
RowGuid uniqueIdentifier
value varbinary(4000)
چون از ساختار ه map در ORM ام استفاده میکنم در جدول دوم هیچ reference ای به table ندارم.(نیازی ندارم)
@صادقیان:به نظر شما ۴۰۰۰ بایت مشکلی ایجاد نمیکنه؟
چطوره؟
البته چون یه implementation ه واقعیه یه سری مشکلات داره.مثلاً محدودیت Attribute/Table نداره.چون موقع پیاده سازی اصلاً بهش دقت نکردم.
اون ستون ه varbinary هم تقریباً اینطوری de/serialize میشه:
....
else if (PType == typeof(System.SByte?)) { bool b = pn != null; sw.Write(b); if (b) sw.Write((SByte)pn); } else if (PType == typeof(System.Boolean?)) { bool b = pn != null; sw.Write(b); if (b) sw.Write((Boolean)pn); } else if (PType == typeof(System.Char?)) { bool b = pn != null; sw.Write(b); if (b) sw.Write((Char)pn); } else if (PType == typeof(System.DateTime?)) { bool b = pn != null; sw.Write(b); if (b)sw.Write(((DateTime)pn).ToBinary()); } else if (PType.IsArray) { Array A = (Array)pn; int R = A.Rank; int B; sw.Write(R); int[] indices = new int[R]; int[] bounds = new int[R]; int L = 1; for (int n = 0; n != R; n++) { B = A.GetLength(n); sw.Write(B); bounds[n] = B; L *= B; } for (int n = 0; n != L; n++) { object P = A.GetValue(indices); if (P == null) { sw.Write((byte)0); } else....
روش دوم هم در دیتابیس توزیع شده خودم هست که کلاً ساختارش متفاوته(تا یه جایی دیتابیس با ساختار ه traditional ه همه ی دیتابیس های دیگست ولی اطلاعات ه sync نشده به شکل increamental ذخیره میشن).توی اون سیستم خود کاربر میتونه در دیتابیس دست ببره بدون اینکه بتونه خرابکاری بکنه.واقعاً طراحیش سخت بود.ولی الان که بعد از حدود یک سال مرورش میکنم میبینم ارزشش رو داشته.
اگر کسی به دیتابیس توزیع شده علاقه داره بگه توضیح بدم.