sql server - معنى - ما هي أفضل الممارسات لاستخدام GUID كمفتاح أساسي ، خاصةً فيما يتعلق بالأداء؟




معنى كلمة عنوان بالانجليزي (4)

لدي تطبيق يستخدم GUID كمفتاح أساسي في كل الجداول تقريبًا وقد قرأت أن هناك مشكلات في الأداء عند استخدام المعرف الفريد العمومي (GUID) كمفتاح أساسي. بصراحة ، لم أر أي مشكلة ، لكنني على وشك بدء تطبيق جديد وما زلت أرغب في استخدام المعرفات الفريدة العمومية (GUID) كمفاتيح أساسية ، ولكن كنت أفكر في استخدام مفتاح أساسي مركب (المعرّف الفريد العمومي (GUID)) وربما حقل آخر .)

إنني أستخدم GUID لأنها لطيفة وسهلة الإدارة عندما يكون لديك بيئات مختلفة مثل قواعد بيانات "الإنتاج" و "الاختبار" و "dev" ، وكذلك بيانات الترحيل بين قواعد البيانات.

سأستخدم الكيان Framework 4.3 وأريد تعيين Guid في رمز التطبيق ، قبل إدراجه في قاعدة البيانات. (أي أنني لا أريد السماح لـ SQL بإنشاء الدليل).

ما أفضل ممارسة لإنشاء مفاتيح أساسية قائمة على المعرف الفريد العمومي (GUID) ، لتجنب مرات الأداء المفترضة المرتبطة بهذا الأسلوب؟


أقوم حاليًا بتطوير تطبيق ويب مع EF Core ، وهنا هو النمط الذي أستخدمه:

كل ما عندي من الطبقات (الجداول) و PK المشترك و FK. لقد حصلت على عمود إضافي بنوع Guid (تم إنشاؤه بواسطة c # constructor) مع فهرس غير مجمع عليه.

تتم إدارة جميع الصلات في الجدول داخل EF من خلال مفاتيح int بينما يتم الوصول إلى كافة من الخارج (وحدات التحكم) مع Guids.

يسمح هذا الحل بعدم إظهار مفاتيح int على عناوين URL ، ولكن مع إبقاء الطراز مرتبًا وسريعًا.


إذا كنت تستخدم GUID كمفتاح أساسي وإنشاء فهرس مجمع ثم أقترح استخدام القيمة الافتراضية لـ NEWSEQUENTIALID () له


لقد تم استخدام المعرف الفريد العمومي كـ PKs منذ عام 2005. في هذا العالم قاعدة البيانات الموزعة ، هو بالتأكيد أفضل طريقة لدمج البيانات الموزعة. يمكنك إطلاق النار وننسى دمج الجداول دون كل قلق من النيات المتطابقة عبر الجداول المرتبطة. يمكن نسخ GUIDs الانضمام دون أي قلق.

هذا هو الإعداد الخاص بي لاستخدام المعرفات الفريدة العمومية (GUID):

  1. PK = المعرف الفريد العمومي. تتم فهرسة المعرفات الفريدة العمومية (GUIDs) المشابهة للسلاسل ، لذلك قد تحتاج جداول الصف المرتفعة (أكثر من 50 مليون سجل) إلى تقسيم الجدول أو تقنيات الأداء الأخرى. يزداد حجم خدمة SQL Server بشكل كبير ، لذا فإن اهتمامات الأداء أقل وأقل قابلية للتطبيق.

  2. PK Guid هو فهرس غير مجمع. لم الفهرس كتلة GUID ما لم يكن NewSequentialID. ولكن حتى في هذه الحالة ، سيؤدي إعادة تشغيل الخادم إلى حدوث فواصل كبيرة في الطلب.

  3. إضافة ClusterID Int إلى كل جدول. هذا هو مؤشر CLUSTERED الخاص بك ... الذي يطلب الجدول الخاص بك.

  4. يعد الانضمام على ClusterIDs (int) أكثر كفاءة ، لكني أعمل مع 20 إلى 30 مليون جدول سجل ، لذا فإن الانضمام على GUID لا يؤثر بشكل واضح على الأداء. إذا كنت ترغب في الحصول على أقصى أداء ، فاستخدم مفهوم ClusterID كمفتاحك الأساسي والانضمام إلى ClusterID.

هنا هو جدول البريد الإلكتروني الخاص بي ...

CREATE TABLE [Core].[Email] (

[EmailID]      UNIQUEIDENTIFIER CONSTRAINT [DF_Email_EmailID] DEFAULT (newsequentialid()) NOT NULL,

[EmailAddress] NVARCHAR (50)    CONSTRAINT [DF_Email_EmailAddress] DEFAULT ('') NOT NULL,

[CreatedDate]  DATETIME         CONSTRAINT [DF_Email_CreatedDate] DEFAULT (getutcdate()) NOT NULL,

[ClusterID] INT NOT NULL IDENTITY,
    CONSTRAINT [PK_Email] PRIMARY KEY NonCLUSTERED ([EmailID] ASC)
);
GO

CREATE UNIQUE CLUSTERED INDEX [IX_Email_ClusterID] ON [Core].[Email] ([ClusterID])
GO

CREATE UNIQUE NonCLUSTERED INDEX [IX_Email_EmailAddress] ON [Core].[Email] ([EmailAddress] Asc)

يقول هذا الرابط أنه أفضل مما استطعت وساعد في صنع القرار. عادة ما أختار int كمفتاح أساسي ، ما لم يكن لدي حاجة محددة ولا أسمح لخادم SQL تلقائيًا بإنشاء / صيانة هذا الحقل ما لم يكن لدي سبب محدد لعدم القيام بذلك. في الواقع ، يجب تحديد مخاوف الأداء استنادًا إلى تطبيقك المحدد. هناك العديد من العوامل التي تلعب هنا بما في ذلك على سبيل المثال لا الحصر حجم db المتوقع ، والفهرسة المناسبة ، والاستعلام الفعال ، وأكثر من ذلك. على الرغم من أن الناس قد يختلفون ، أعتقد أنه في العديد من السيناريوهات ، لن تلاحظ أي اختلاف مع أي من الخيارين ويجب عليك اختيار ما هو الأنسب لتطبيقك وما يسمح لك بالتطوير بطريقة أسهل وأسرع وأكثر فعالية (إذا لم تقم بإكمال التطبيق مطلقًا ما الفرق الذي يصنعه الباقي :).

https://web.archive.org/web/20120812080710/http://databases.aspfaq.com/database/what-should-i-choose-for-my-primary-key.html

ملاحظة: لست متأكدًا من سبب استخدامك لـ PK المركب أو ما الذي تعتقد أنه قد يمنحك ذلك.





guid