كيف يمكن أن تخزين وسائل الاتصال (أو البيانات المكتوبة مماثلة مع مختلف المجالات) بطريقة طبيعية؟

StackOverflow https://stackoverflow.com/questions/633143

سؤال

ولقد عبرت هذه المشكلة في، أوه، كل تطبيق لقد كتبت من أي وقت مضى. أود إجابة إجماع النهائية!

هل هذا هو الأكثر طبيعية / كفاءة الطريقة الصحيحة / لتخزين وسائل الاتصال أو أي بيانات أخرى على طول هذا النمط في قاعدة البيانات؟

Contact { PK ContactId, ... }

ContactContactMethod {PK FK ContactId, PK FK ContactMethodId, Key, Comments }

AddressContactMethod {PK FK ContactMethodId, Line1, Line2, City, State, Zip }
EmailContactMethod {PK FK ContactMethodId, EmailAddress }
InstantMessengerContactMethod {PK FK ContactMethodId, IMClient, IMAddress }
PhoneContactMethod {PK FK ContactMethodId, ... }
WebsiteContactMethod {PK FK ContactMethodId, ... }
OtherContactMethod {PK FK ContactMethodId, ... }

وإذا ما أعتبر حقل XML لContactMethodData على الطاولة ContactContactMethod بدلا من ذلك؟

وشيء يشعر فقط خاطئة عن AddressContactMethod، EmailContactMethod، الخ جميع تقاسم نفس تفرد المفاتيح الأساسية.

ويعتقد أيضا عن مفتاح، زوج قيمة للبيانات الاتصال، ولكن ذلك سيكون أكثر حتى من الألم الاستعلام من حقل XML.

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

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

المحلول

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

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

وهذا يترك تصميم شيء من هذا القبيل:

Contact { PK ContactId, ... }
ContactType { PK ContactTypeId, ContactType }
ContactMethod {PK FK ContactId, PK FK ContactTypeId, PK Key, Value, Comments }

ووContactMethod.Value هي قيمة النص.

وهذا يبدو مماثل لكيفية يتتبع Google الاتصالات على أقل تقدير. وكأن شيئا آخر، لقد فكرت من المحتمل عن طريق المشكلة لمتابعة zillions من الاتصالات من كل أمة على الأرض.

نصائح أخرى

وهناك اسم لهذا النمط. انه دعا "تعميم التخصص".

في هذه الحالة طرق الاتصال هي وسائل متخصصة للاتصال جهة اتصال.

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

في الأيام الخوالي كنت قد ذهبت مع مخطط الجدول - شيء من هذا القبيل:

Person [ID, Name]
ContactPoint [ID, PersonID, ContactMethod]
EmailContactPoint [ID, EmailAddress]
AddressContactPoint [ID, Line1, Line2, blah]

ومع وجود علاقة بين 1-1 نقاط الاتصال المختلفة، والجدول ContactPoint - وهو نوع من الميراث. ORM في مثل السبات / NHibernate والكيان الإطار يمكن إنشاء مثيل النوع الصحيح بناء على هذه العلاقات 1-1.

وهذه الأيام ربما كنت مجرد الذهاب مع فقاعة XML، واثنين من وظائف في SQL لتجعل من السهل للتعامل مع نقطة الاتصال الافتراضي / الأساسي لنوع معين (على سبيل المثال، "GetPrimaryPhoneNumber (personID)".

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

ومعظم الناس حقا على الأشياء معماري. ننظر الى الامر بهذه الطريقة، كم عدد أرقام الهواتف لمعين الاتصال هل يهتمون حقا؟ عادة 1؛ أحيانا 2.

ونفس عن عناوين وعادة كل ما تحتاجه حقا هو واحد في الملف.

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

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

لتلخيص: الحفاظ على قاعدة بيانات بسيطة كما يمكن أن يكون. فريق UI، وخادم قاعدة البيانات الخاصة بك، سوف نشكركم على ذلك.

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