ما هي أفضل الممارسات في db التصميم عندما كنت ترغب في تخزين قيمة إما مختارة من قائمة منسدلة أو المستخدم دخلت ؟

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

سؤال

أنا في محاولة للعثور على أفضل طريقة لتصميم قاعدة البيانات من أجل السماح السيناريو التالي:

  1. يتم تقديم المستخدم مع قائمة منسدلة من الجامعات (على سبيل المثال)
  2. يختار المستخدم له/لها الجامعة من القائمة إذا كان موجودا
  3. إذا كانت الجامعة لا وجود لها ، يدخل جامعة في مربع نص (نوع من مثل:[___________])

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

وذلك بفضل!

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

في ظني ، فإنه أدخل معرف المستخدم و EducationID في عدة الجدول.الآن ما إذا كان المستخدم هو الدخول في قاعدة البيانات ؟ فإنه لا يزال المخزنة في صفحته ، ولكن أين ؟ typing "St"...suggesting Stanford

typing non-existing university

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

المحلول

CREATE TABLE university
(
  id smallint NOT NULL,
  name text,
  public smallint,
  CONSTRAINT university_pk PRIMARY KEY (id)
);

CREATE TABLE person
(
  id smallint NOT NULL,
  university smallint,
  -- more columns here...
  CONSTRAINT person_pk PRIMARY KEY (id),
  CONSTRAINT person_university_fk FOREIGN KEY (university)
      REFERENCES university (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);

الجمهور هو تعيين إلى 1 الوحدات في النظام ، 0 أدخلها المستخدم-unis.

نصائح أخرى

لك يمكن أن الغش:إذا كنت لا تشعر بالقلق حول التكامل المرجعي من هذا المجال (أيفقط تظهر في صفحة المستخدم الشخصية و ليس مطلوبا بصرامة قواعد العمل), متجر بسيط VARCHAR العمود.

الخاص بك القائمة المنسدلة استخدام استعلام مثل:

SELECT DISTINCT(University) FROM Profiles

إذا كنت ترغب في تصفية الأخطاء المطبعية أو العرضية واحد ، حاول:

SELECT University FROM PROFILES
GROUP BY University
HAVING COUNT(University) > 10  -- where 10 is an arbitrary threshold you can tweak

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

الحفاظ على العلم الصفوف دخل من خلال إدخال المستخدم في طاولة واحدة لديك الخاص بك نقاط البيانات الأخرى.ثم يمكنك فرز باستخدام العلم.

طريقة واحدة تم حلها في شركة سابقة عملت في:

إنشاء اثنين من الأعمدة في الجدول الخاص بك:1) nullable معرف النظام الموردة سلسلة (المخزنة في جدول منفصل) 2) يتم توفيره من قبل المستخدم سلسلة

واحد فقط من هذه المناطق.قيدا يمكن فرض هذه (بالإضافة إلى أن واحدا على الأقل من هذه الأعمدة هو بالسكان إذا كان ذلك مناسبا).

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

هذا ليس تصميم قاعدة البيانات هذه المسألة.انها واجهة المستخدم المسألة.

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

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

لست متأكدا إذا كان السؤال واضح جدا هنا.

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

INSERT INTO MyTable Name VALUES ('myval'); SELECT @@SCOPE_IDENTITY()

هذا هو ضد MS SQL 2008 على الرغم من أنني لست متأكدا مما إذا كان @@SCOPE_IDENTITY() العالمي موجود في إصدارات أخرى من SQL, ولكن أنا متأكد من أن هناك حكمه.

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