Я розробник програмного забезпечення. Я люблю кодувати, але ненавиджу бази даних ... Зараз я створюю веб-сайт, на якому користувачеві буде дозволено позначати суб'єкт господарювання як сподобався (як у FB), позначити його та прокоментувати .
Я застрягаю в дизайні таблиць баз даних для обробки цієї функціональності. Рішення є тривіальним, якщо ми можемо це зробити лише для одного типу речей (наприклад, фотографій). Але мені потрібно ввімкнути це для 5 різних речей (наразі, але я також припускаю, що ця кількість може зростати, коли зростає вся служба).
Тут я знайшов кілька подібних запитань, але жодне з них не має задоволеної відповіді, тому я задаю це питання ще раз.
Питання полягає в тому, як правильно, ефективно та еластично спроектувати базу даних, щоб вона могла зберігати коментарі до різних таблиць , лайків для різних таблиць та тегів для них. Якась модель дизайну як відповідь буде найкращою;)
Детальний опис : у мене є таблиця User
з деякими даними користувачів і ще 3 таблиці : Photo
з фотографіями , Articles
зі статтями , Places
з місцями . Я хочу ввімкнути будь-якого зареєстрованого користувача:
прокоментуйте будь-яку з цих 3 таблиць
позначте будь-який із них як сподобався
позначте будь-який із них тегом
Я також хочу порахувати кількість лайків для кожного елемента та кількість разів, коли цей тег був використаний.
1- й підхід :
а) Для тегів , я створити таблицю Tag [TagId, tagName, tagCounter]
, то я буду створювати багато-до-багатьох відносини таблиць для: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
б) Те саме вважається за коментарі.
в) я створю таблицю LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Кількість лайків буде розрахована за запитами (що, я вважаю, це погано). І ...
Мені дуже не подобається ця конструкція останньої частини, вона погано пахне для мене;)
2 - й підхід :
Я створити таблицю , ElementType [idType, TypeName == some table name]
яка буде заповнюватися адміністратором (мене) з іменами таблиць , які можуть бути сподобалися , коментували або помічені . Тоді я буду створювати таблиці :
а) LikedElement [idLike, idUser, idElementType, idLikedElement]
те саме для коментарів і тегів із відповідними стовпцями для кожного. Тепер, коли я хочу зробити сподобалось фото, я вставив:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
і для місць:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
і так далі ... Я думаю, що другий підхід кращий, але я також відчуваю, що щось не вистачає і в цій конструкції ...
Нарешті, мені також цікаво, яке найкраще місце для зберігання лічильника, скільки разів сподобався елемент. Я можу думати лише про два способи:
- в
Photo/Article/Place
таблиці елементів ( ) - шляхом вибору count ().
Я сподіваюся, що моє пояснення цього питання більш ґрунтовне.