עמודת "תגיות", סינון כמה תגיות
-
בסיס נתונים mysql , שרת nodejs, ספריה sequelize.
יש לי טבלה שאני צריך בה עמודה אחת של תגיות
ותיהיה לי אפשרות לסנן שורות על פי תגיות, אבל יכולים להיות לי בסינון מספר תגיות.
לדוגמא, יש לי תגיות: "פסח", "מצה", "מרור", "סוכות", "סוכה", "לולב"...
אני רוצה ליצור שאילתה שתוכל לשלוף לי את כל השורות שיש להם את אחת מהתוויות: "פסח"/"סוכה".
מה הדרך הנכונה לשמור בטבלה (סוג text (לכאורה מופרד בפסיקים) או json (עם מערך)).
ואיך לבצע את השאילתה נכון?
אני חושב שניתן לעשות סינון שלteg like '%סוכה%' OR tag like '%פסח%'
אבל נראה לי שזה יעשה בעיות לתגיות כדוגמת אם יש תג נפרד
לולב
ונפרדלולבים
תודה -
כרגיל, עצם שאלת השאלה נותנת פתח לתשובה
אני חושב כעת שאם שומרים כטקסט מופרד בפסיקים ברורים וללא רווח (פונקציית עיבוד בצד השרת לפני שמירה)
אפשר לבצע את השאילתה כך:teg like '%,סוכה,%' OR tag like '%,פסח,%'
מה שייתן רק את התוצאות מבוקשות.
וא"כ נותר רק לברר מה הדרך הנכונה מבחינת משאבים -
@חוקר מומלץ בחום לעשות טבלה חדשה,
עם מזהה ישות ושם תגית כטקסט, שליפה לפי JOIN, והכנסה/מחיקה פשוטים ובלי עדכונים (אלא"כ משנים שם תגית).
כפי שרמזת הדרך שהצעת היא גרועה מבחינת משאבים (אין אינדקס אם אתה מחפש לפי מכיל).
יש עוד בעיות בדרך שכתבת, כי צריך שהתוכנה תהיה חכמה ולא תרשה תווים מסויימים בתגית, במקרה שלנו זה פסיקים, כמו"כ שיהיה תמיד פסיק גם בהתחלה וגם בסוף (זה נשמע פשוט אבל אחרי תקופה פתאום נזכרים ומטיחים את הראש).
הפתרון האחר שזהכרת JSON הוא פותרת את הבעיות האחרונות, אבל מבחינת ביצועים הוא עדיין נחות מאוד מטבלה חדשה. -
@dovid כתב בעמודת "תגיות", סינון כמה תגיות:
שליפה לפי JOIN
לא ברור לי מה אני שומר בטבלת הנתונים עצמה.
איך אני משייך שורה לתוויות.
אולי אתה מתכוין לטבלה שלישית המכילה מזהה שורה ומזהה תווית?
ואז שליפת כל התוויות עם join לטבלה המקשרת ואז join אל התוצאות עצמן? -
@חוקר אני כעת רואה שיש לMYSQL פונקציה מיוחדת שבודקת אם איבר נמצא ברשימה מופסקת בפסיקים:
WHERE FIND_IN_SET('סוכה', `TAGS`)
מקור: גוגל comma separated list mysql ואז https://stackoverflow.com/q/2674011/1271037
אבל לעדכון אין משהו מובנה..
בכל מקרה זה גרוע מכמה כיוונים וזה אנטי-נירמול. -
@חוקר כתב בעמודת "תגיות", סינון כמה תגיות:
לא ברור לי מה אני שומר בטבלת הנתונים עצמה.
הייתה לך טבלה אחת, שהכילה ישויות שאין לי מושג מה מהותם.
רצית בשדה אחד בטבלה זו לאחסן רשימת תגיות מופרדת בפסיקים.
ואני הצעתי לך להוסיף טבלה אחת, ויש בה שני עמודות בלבד: מזהה זר של הטבלה הנ"ל, ושם התגית.
שליפה מותנית אתה עושה עם JOIN בין שני הטבלאות וWHERE על התגית.
שליפה רגילה עם כל התגיות הרלוונטיות אתה יכול עם JOIN רגיל ואז יש לך שורות לקבץ בקליינט, או GROUP BY ובשביל לקחת את כל התגיות להשתמש עם GROUP_CONCAT שמייצר לך רשימה מופרדת בפסיקים לקליינט. אפשרות שלישית זה לשמור תמיד עותק של הרשימה בעמודת טקסט בטבלה הראשונה רק בשביל לחסוך את הבעיה הזו. -
@nigun לא ייתרון בביצועים, אלא ייתרון בנרמול.
בכללי הנרמול יש סוג כלל שאותו ישות צריך להופיע רק במקום אחד.
ואולם פה המפתח והישות יכולים להיות דבר אחד, אז ניתן להקל בעניין.
אלא שמטבע העולם שתגית מתחילה עם שדה אחד של ערך טקסט, אבל יכולה להתפתח, למשל האם זמין לסינון, שפה, וכל מיני מאפיינים שנולדים לה. אז לכן יש ייתרון להצעה שלך לעניין זה, אבל זה קצת מוסיף סיבוך לשליפה וכולי.