Задать вопрос
@Richard_Ferlow
Веб-программист

Mysql: как хранить данные json и при этом избежать дублирования?

Работаю с базой данных отелей по API, сейчас занят тем что кэширую статичную информацию.

Собственно вопрос о том, как все данные хранить

Вот пример информацией об отеле

{
 "gen_timestamp": 1381489054.0071,
 "hotels": [
 {
 "id": "1058790",
 "cityId": "895",
 "stars": "2",
 "pricefrom": null,
 "rating": "0.0",
 "popularity": "1150",
 "propertyType": "",
 "checkOut": "",
 "checkIn": "",
 "distance": "1.00",
 "photoCount": "3",
 "photos": [
 {
 "url": "http://photo.hotellook.com/image_v2/original/151594987.jpg",
 "width": "298",
 "height": "240"
 },
 {
 "url": "http://photo.hotellook.com/image_v2/original/682702387.jpg",
 "width": "320",
 "height": "240"
 },
 {
 "url": "http://photo.hotellook.com/image_v2/original/700461773.jpg",
 "width": "320",
 "height": "239"
 }
 ],
 "facilities": [
 "22",
 "7",
 "43",
 "3",
 "41",
 "14",
 "9",
 "83",
 "25",
 "13",
 "56",
 "80",
 "37"
 ],
 "shortFacilities": [
 "restaurant",
 "parking",
 "laundry",
 "internet",
 "pool"
 ],
 "location": {
 "lat": "6.256917",
 "lon": "81.236275"
 },
 "name": {
 "en": "Wila Safari"
 },
 "address": {
 "en": "WEERAWILA"
 },
 "link": "/LK/Weerawila-895/Wila_Safari-1058790.html"
 }
 ]
}


Получаю эту информацию дела запрос по определенному "месту". условно - "город".

Сначала я сделал как - создал таблицу под отели куда вносил все из примера выше кроме того, что выглядело как множество - т.е. фото, facilities, shortFacilities - эти таблицы выглядели примерно так

catid, id, name(type), cityid
catid - автоинкремент, чтобы у каждой записи был уникальный номер
id - принадлежность к отелю
name(type) - смотря что за таблица - номер или название
cityid - эту переменную я ввел чтобы при обновлении последующем по городу можно было бы делая один запрос удалять данные перед записью новых.

И собственно, столкнулся со следующей проблемой. - к примеру делаю запрос для "город" - Гоа с id 395
- и запрос вернет отели не только "cityId": "395", но и многие другие, так как Гоа не конкретное место, а штат. и для каждого из этих "других" городов делать запрос - там отели в выдаче будут дублироваться

поэтому получилось, что во-первых в моей схеме не будут учтены данные о принадлежности к разным местам одного отеля.
и получается делая запрос к местности с определенным ID я не могу просто по этому ID удалить отели и фото из базы, чтобы внести новые данные.

для главной таблицы отелей можно REPLACE допустим использовать, но тогда не получу нигде принадлежности к разным "городам", а таблица с фото, facilities, shortFacilities - их чтобы очистить нужно будет под каждый отель отдельный запрос DELETE делать.

ну и городов очень много - более 30тыс. во многих очень много отелей, поэтому процесс получения и обновления данных должен быть максимально быстрым и простым. иначе и за сутки столько информации сервер не переварит.
  • Вопрос задан
  • 3496 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@green_turtle
Может имеет смысл использовать NoSQL базу, например MongoDB? Просто добавляете (обновляете) отели (json) в коллекцию, а затем при помощи aggregation framework делаете выборки.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы