سؤال

تحديث] النهج المختار أدناه، كرد على هذا السؤال

أهلا،

لقد كنت أبحث في هذا الموضوع ولكن لا يمكنني العثور على ما أبحث عنه حقا ...

مع جدول التعليمات البرمجية أعني: أشياء مثل "الحالة الجارية" أو الجنس أو الدول القانونية أو الاجتماعية المحددة ... بشكل أكثر تحديدا، تحتوي هذه الأنواع على خصائص فقط والعناصر ليست على وشك التغيير قريبا (ولكن يمكن). خصائص كونها معرف واسم وصف.

أنا أتساءل كيفية التعامل مع هذه الأفضل في التقنيات التالية:

  • في قاعدة البيانات (جداول متعددة، جدول واحد مع مفاتيح رمز مختلفة ...؟)

  • إنشاء الفصول (ربما شيء مثل ورث Icode مع Icode.Name and Icode.Description)

  • إنشاء عرض / مقدم عرض لهذا: يجب أن تكون هناك شاشة تحتوي على جميعها، لذلك قائمة من الأنواع (الجنس أو الحالة الجارية ...)، ثم قائمة القيم لهذا النوع مع اسم ووصف لكل منهما عنصر في قائمة القيمة.

هذه هي الأشياء التي تظهر في كل مشروع واحد، لذلك يجب أن يكون هناك أفضل الممارسات حول كيفية التعامل مع هذه ...

بالنسبة للسجل، أنا لست مولعا حقا باستخدام عودة لهذه المواقف ... أي حجج حول استخدامها هنا هي موضع ترحيب أيضا.

متابعة

حسنا، لقد حصلت على إجابة لطيفة من قبل Codetoglory و Ahsteele. دعونا نؤيد هذا السؤال.

قل نحن لا نتحدث عن النوع الاجتماعي أو الوضع الجاري، فإن قيم Wich ستتغير بالتأكيد، ولكن حول "الاشياء" التي لها اسم ووصف، ولكن لا شيء أكثر. على سبيل المثال: الأحكاد الاجتماعية والحالات القانونية.

واجهة المستخدم: أريد شاشة واحدة فقط لهذا. ListBox مع أنواع NAMEANDSCICTICTIPTEDDEDSCRYDSTRYDSTRYDSTICTION (سوف أتصل بها فقط)، ListBox مع القيم المحتملة لنوع NameanDDescription المحدد، ثم حقل اسم ووصف لعنصر نوع NameanDDescription المحدد.

كيف يمكن التعامل مع هذا في الرأي والمقدمين؟ أجد صعوبة هنا أن تكون أنواع nameanddescription ستحتاج إلى استخراجها من اسم الفصل؟

DB: ما هي الموالية / سلبيات لجداول البحث واحدة مقابل متعددة؟

هل كانت مفيدة؟

المحلول 3

لقد قررت الذهاب مع هذا النهج:

CodeKeyManager mgr = new CodeKeyManager();
CodeKey maritalStatuses = mgr.ReadByCodeName(Code.MaritalStatus);

أين:

  • CodeKeyManager يمكن استرداد codekeys من db (codekey = maritalstatus)
  • الرمز هو فئة مليئة الثوابت، والأسلوتات العائدة لذلك الرمز. maritalstatus = "maritalstatus". هذه الثوابت خريطة إلى جدول CodeKey> CodeKeyName
  • في قاعدة البيانات، لدي 2 طاولات:
    • CodeKey مع ID، CodeKeyName
    • codevalue مع codekeyid، valueName، valuedescription

DB:

نص Alt http://lh3.ggpht.com/_cnmigbr3eka/seznmhcghzi/aaaaaaaaafu/2otzmtmnqfw/codetables_1.jpg.

رمز الفصل:

public class Code
{
    public const string Gender = "gender";
    public const string MaritalStatus = "maritalStatus";
}

Code Codekey:

public class CodeKey
{
    public Guid Id { get; set; }
    public string CodeName { get; set; }

    public IList<CodeValue> CodeValues { get; set; }
}

codevalue codevalue:

public class CodeValue
{
    public Guid Id { get; set; }

    public CodeKey Code { get; set; }

    public string Name { get; set; }
    public string Description { get; set; }

}

أجد إلى حد بعيد الطريقة الأسهل والأكثر فعالية:

  • يمكن عرض جميع بيانات التعليمات البرمجية بطريقة مماثلة (في نفس العرض / مقدم العرض)
  • لست بحاجة إلى إنشاء جداول ودروس لكل جدول رمز يأتي
  • ولكن لا يزال بإمكاني الحصول عليها من قاعدة البيانات بسهولة واستخدامها بسهولة مع ثوابت Codekey ...
  • يمكن lihibernate التعامل مع هذا بسهولة أيضا

الشيء الوحيد الذي ما زلت أفكر فيه هو إلقاء رموز السلسلة (NCHCHAR) باستخدام معرف GUID واستخدامها لاستخدام قابلية الاستخدام في منطق الأعمال.

شكرا على الإجابات! إذا كان هناك أي ملاحظات حول هذا النهج، يرجى القيام بذلك!

نصائح أخرى

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

أود أن أوصي دائما باستخدام مفتاح التشغيل الأساسي المركزي بدلا من الرمز أو الوصف. هذا يسمح لك باستخدام رموز متعددة (من نفس الاسم ولكن أوصاف مختلفة) على فترات مختلفة من الوقت. بالإضافة إلى معظم DBAS (في تجربتي) بدلا من استخدام Autonumber عبر المفاتيح الأساسية القائمة على النص.

أود استخدام جدول واحد لكل قائمة مشفرة. يمكنك وضع رموز متعددة في طاولة واحدة لا تتعلق (باستخدام مصفوفة من أنواع) ولكن هذا يحصل فوضوي ولم أجد إلا بضع حالات حيث كان مفيدا للغاية.

زوجين من الأشياء هنا:

  1. استخدام تعدادات واضحة صراحة ولن تتغير. على سبيل المثال، maritalstatus، الجنس وما إلى ذلك.

  2. استخدم جداول البحث عن العناصر غير المحددة على النحو الوارد أعلاه وقد تتغير، وزيادة / نقصان مع مرور الوقت.

من النموذجي أن يكون لديك جداول البحث في قاعدة البيانات. حدد كائن مفتاح / قيمة في الطبقة التجارية التي يمكن أن تعمل مع عرض / عرض العرض التقديمي الخاص بك.

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

أن التعدادات المذكورة تعمل بشكل جيد للأشياء التي لن تتغير مثل الجنس وما إلى ذلك.

لماذا يريد الجميع تعقيد جداول التعليمات البرمجية؟ نعم هناك الكثير منها، لكنها بسيطة، لذلك احتفظ بها بهذه الطريقة. فقط تعاملهم مثل كائن آخر من أي وقت مضى. أنت جزء من المجال، لذلك نموذجها كجزء من المجال، لا شيء خاص. إذا لم تفعل ذلك عندما يحتاجون إلى مزيد من السمات أو الوظائف، فسيتعين عليك التراجع عن جميع التعليمات البرمجية التي تستخدمها حاليا وإعادة صياغةها.

طاولة واحدة لكل بالطبع (للحصول على سلامة مرجعي، بحيث تكون متاحة للإبلاغ).

بالنسبة للفصول، مرة أخرى واحدة لكل بالطبع لأنه إذا كتبت طريقة لاستلام كائن "جنس"، لا أريد أن أكون قادرا على نقلها عن طريق الخطأ "marrialstatus"! دع الترجمة تساعدك على الخروج من خطأ وقت التشغيل، ولهذا السبب هناك. يمكن لكل فصل ببساطة أن يرث أو تحتوي على فئة نادرة أو أي شيء ولكن هذا ببساطة مساعد تنفيذ.

بالنسبة ل UI، إذا كان الأمر كذلك في الواقع، فستفترض أنه يمكن تدوينه الموروثة، ففترض أنك يمكن أن تستخدم ذلك لمساعدتك في الخروج والصيانة فقط في واجهة مستخدم واحدة.

كقاعدة عامة، لا تفشل نموذج قاعدة البيانات، لا تعبث نموذج العمل، لكنه لا يمكنك المسمار حولها قليلا في نموذج UI، هذا ليس سيئا للغاية.

أود أن أفكر في تبسيط هذا النهج أكثر. بدلا من 3 جداول تعريف الرموز (الرمز، CodeKey و Codevalue) ماذا عن جدول واحد فقط يحتوي على أنواع التعليمات البرمجية وقيم التعليمات البرمجية؟ بعد كل أنواع التعليمات البرمجية هي مجرد قائمة أخرى من الرموز.

ربما تعريف الجدول مثل هذا:

CREATE TABLE [dbo].[Code](
    [CodeType] [int] NOT NULL,
    [Code] [int] NOT NULL,
    [CodeDescription] [nvarchar](40) NOT NULL,
    [CodeAbreviation] [nvarchar](10) NULL,
    [DateEffective] [datetime] NULL,
    [DateExpired] [datetime] NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED 
(
    [CodeType] ASC,
    [Code] ASC
)
GO

يمكن أن يكون هناك سجل جذر مع CodeType = 0، Code = 0 الذي يمثل النوع الخاص ب CodeType. تحتوي جميع سجلات CodeType على مجموعة من الرصاص = 0 والرمز> = 1. فيما يلي بعض بيانات العينات التي قد تساعد في توضيح الأشياء:

SELECT CodeType, Code, Description FROM Code

Results:

CodeType    Code    Description
--------    ----    -----------
0           0       Type
0           1       Gender
0           2       Hair Color
1           1       Male
1           2       Female
2           1       Blonde
2           2       Brunette
2           3       Redhead

يمكن إضافة قيود فحص إلى جدول التعليمات البرمجية للتأكد من إدخال ملف تعريف ترميز كصم صالح في الجدول:

ALTER TABLE [dbo].[Code] WITH CHECK ADD CONSTRAINT [CK_Code_CodeType]   
CHECK (([dbo].[IsValidCodeType]([CodeType])=(1)))
GO

يمكن تعريف وظيفة IsValidCodetype النمط مثل هذا:

CREATE FUNCTION [dbo].[IsValidCodeType]
(
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @Result BIT
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = 0 AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    RETURN @Result
END
GO

مشكلة واحدة تم رفعها هي كيفية ضمان وجود جدول مع عمود التعليمات البرمجية قيمة مناسبة لنوع الكود هذا. يمكن تطبيق هذا أيضا من خلال قيد الشيك باستخدام وظيفة.

هنا طاولة شخص لديه عمود جنساني. يمكن أن تكون أفضل الممارسات لتسمية جميع أعمدة الكود مع وصف نوع الكود (النوع الاجتماعي في هذا المثال) متبوعا برمز الكلمة:

CREATE TABLE [dbo].[Person](   
    [PersonID] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [nvarchar](40) NULL,
    [FirstName] [nvarchar](40) NULL,
    [GenderCode] [int] NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([PersonID] ASC)
GO

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [CK_Person_GenderCode] 
CHECK (([dbo].[IsValidCode]('Gender',[Gendercode])=(1)))
GO

يمكن تعريف iSvalidcode بهذه الطريقة:

CREATE FUNCTION [dbo].[IsValidCode]
(
    @CodeTypeDescription NVARCHAR(40),
    @Code INT
)
RETURNS BIT
AS
BEGIN
    DECLARE @CodeType INT
    DECLARE @Result BIT

    SELECT @CodeType = Code
    FROM dbo.Code
    WHERE CodeType = 0 AND CodeDescription = @CodeTypeDescription

    IF (@CodeType IS NULL)
    BEGIN
        SET @Result = 0
    END
    ELSE
    BEGiN
    IF EXISTS(SELECT * FROM dbo.Code WHERE CodeType = @CodeType AND Code = @Code)
        SET @Result = 1
    ELSE
        SET @Result = 0
    END

    RETURN @Result
END
GO

يمكن إنشاء وظيفة أخرى لتوفير وصف التعليمات البرمجية عند الاستعلام عن جدول يحتوي على عمود رمز. هنا مثال على الاستعلام عن جدول الشخص:

SELECT PersonID,
    LastName,
    FirstName,
    GetCodeDescription('Gender',GenderCode) AS Gender
FROM Person

تم تصور كل هذا من وجهة نظر منع انتشار جداول البحث في قاعدة البيانات وتوفير جدول بحث واحد. ليس لدي أي فكرة عما إذا كان هذا التصميم يؤدي جيدا في الممارسة العملية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top