سؤال

أنا جديد بعض الشيء sqlite, ، وأنا أواجه معضلة طفيفة حول تصميم قاعدة البيانات الخاصة بي. سأشرح. لنفترض أنك وأصدقائك تستخدم عددًا من الأسماء المستعارة المختلفة على الإنترنت (يمكن أن تكون أكثر من شخص واحد لكل شخص). ما لدينا هنا هو معرف الشخص وقائمة جميع الأسماء المستعارة التي يستخدمها هذا الشخص. هذا إدخال واحد في قائمة كبيرة. الهدف هنا هو تخزين هذه البيانات باستخدام SQLite بطريقة يمكن استخدام عبارة SELECT لجلب جميع الإدخالات التي تحتوي على اللقب المحدد.

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

أفكار؟

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

المحلول

بالنسبة للمبتدئين ، إليك ما لديك

SELECT Name, Nickname FROM MyTable WHERE Nickname = 'Copper';

لكنني أقترح بشدة وجود جدول للأسماء ، وجدول للألقاب المستخدمة ، بحيث يكون لقب الإشارة إلى الأسماء.

CREATE TABLE Users (
    UserId INTEGER PRIMARY KEY, 
    Name TEXT
    );
CREATE TABLE Nicknames (
    NickNameId INTEGER PRIMARY KEY, 
    UserId INTEGER REFERENCES Users(UserId), 
    NickName Text
    );

ستجد هذا المخطط سيمنحك المزيد من التحكم في تحرير الإدخالات ، وإزالتها ، إلخ.

الاستعلام عنها مع إما INNER JOIN:

SELECT Users.Name, NickNames.NickName 
    FROM Users INNER JOIN NickNames ON User.UserId=NickNames.UserId
    WHERE NickNames.NickName = 'Copper';

أو استفسار متداخل:

SELECT Users.Name
    FROM Users
    WHERE User.UserId IN (
    SELECT NickNames.UserId 
        FROM NickNames 
        WHERE NickNames.NickName = 'Copper');

الاثنان متكافئان (في هذه الحالة) لتحديد الانضمام إلى أ WHERE بند. هو - هي يعمل, ، لكن هذا شكل ضعيف (ليس واضحًا مثل INNER JOIN):

SELECT Users.Name, NickNames.NickName 
    FROM Users, NickNames 
    WHERE User.UserId = NickNames.UserId
    AND NickNames.NickName = 'Copper';

نصائح أخرى

لماذا لا تملك فقط الجداول التالية:

شخص (أعمدة: person_id ، person_name)

لقب (أعمدة: NEWSAME_ID ، لقب)

person_nickname (الأعمدة: person_id ، numname_id)

ثم تقوم بإنشاء مفاتيح أجنبية من شخص إلى شخص _nickname ومن اللقب إلى person_nickname. هذا يسمح لشخص معين أن يكون لديه العديد من الأسماء المستعارة كما تريد.

بعد ذلك ، للعثور على جميع الأشخاص الذين يتطابقون مع لقب معين ، يمكنك الكتابة:

SELECT p.person_name
  FROM person.p
     , nickname n
     , person_nickname pn
 WHERE n.nickname = 'nickname of interest'
   AND p.person_id = pn.person_id 
   AND n.nickname_id = pn.nickname_id

تحتاج إلى جدولين:

  • المستخدمون
  • اسماء مستعارة

في الجدول "المستخدمون" لديك معرف ، اسم ، معلومات اختيارية أخرى على المستخدم. في الجدول "الأسماء المستعارة" لديك user_id ، لقب.

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

SELECT nicknames.nickname FROM nicknames WHERE nicknames.user_id=id

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

SELECT table.nickname FROM table WHERE table.user="john"

يعمل نهج CSV ولكنك ستحتاج إلى تنفيذ وظيفتك الخاصة لإضافة/إزالة/تحليل الأسماء المستعارة ، وسيكون من المؤكد أن يكون التنفيذ اللذين شرحتهما.

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