Это хороший способ для разработки базы данных без SQL? - PullRequest
1 голос
/ 25 мая 2019

У меня достаточно большой опыт работы с базами данных отношений, но я хочу попробовать не-SQL (ключ-значение).И составили для этого задачу.И это еще одна короткая ссылка с группировкой пользователей, кампаний и статистики.И он должен работать в условиях высокой нагрузки, конечно =)

Использование случаев:

1. Generate short link
1.1. User is not logged, without a campaign.
  Put a pair to the bucket LINKS, don't put to USERS and CAMPAIGNS buckets.
1.2. User is logged, without a campaign.
  Put the pair to LINKS, update a counter in the bucket USERS, don't put to CAMPAIGN bucket.
1.3. User is logged and campaign is created.
  Put/update pairs to all the buckets.
2. Get statistics.
2.1. Get all links and its stats by user (must be logged).
2.2. Get all links and its stats by campaign (must be logged).
2.3. Get stats by short url (must be logged).
3. Redirect to a long url by short one (no matter logged user or not).

Как я решаю эту задачу с базой данных отношений,Четыре таблицы:

  • пользователи (id, имя);
  • кампании (owner_id, id, name);
  • urls (shortURL, campaign_id, long_url);
  • stats (shortURL, get_counter, creation_at, last_access_at).

Конечно, я здесь пропустил индексы и денормализацию.

И теперь я думаюкак реализовать это в БД без SQL (kv).

Обозначения: (b) - сегмент корзины / вложенный блок, (k) - ключ, (v) - значение

/.
 |--- (b) USERS --- (k) user_id
 |              --- (v) { "name": "User", "settings": {}, "stats": {"link_count": 1}, "links": ["a","b"]}
 |--- (b) LINKS --- (k) short_link
 |              --- (v) { "long_link": "https://example.com", "stats" : {"counter": 1, "created_at": "2019-01-01T00:00:00Z, "last_access_at": "2019-01-01T00:00:01Z"}}
 |--- (b) CAMPAIGNS --- (b) USER_ID --- (k) campaign_id
 |                                  --- (v) { "name": "campaign", "links": ["a", "b"]}

Это правильный способ ее решить?

2.1.Получает все ссылки из группы USERS по user_id из массива ссылок, затем получает всю статистику, получая статистику по short_url одну за другой.

2.2.Так же, как и выше.Получает ссылки из массива CAMPAIGNS.USER_ID.links и получает статистику одну за другой из корзины LINKS.

Или дизайн базы данных kv совершенно неправильный?

...