SQLite - حدد عبر إدخالات متعددة من نفس البيانات/العمود
-
20-09-2019 - |
سؤال
أنا جديد بعض الشيء 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 ولكنك ستحتاج إلى تنفيذ وظيفتك الخاصة لإضافة/إزالة/تحليل الأسماء المستعارة ، وسيكون من المؤكد أن يكون التنفيذ اللذين شرحتهما.