2016-01-01 2 views
5

Каков наилучший подход для обновления неиндексированного обычного столбца (не связанного с первичным ключом) во всех таблицах, содержащих его как дубликат?Как обрабатывать изменение денормализованных данных

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

Solutions Я имею в виду:

  1. Иметь таблицу сопоставителя выследить первичные ключи во всех этих таблицах, но это, кажется, ведет к таблицам взрыва (пост не единственное свойство, которое может изменить).
  2. Используйте Solr, чтобы сделать сопоставление, но я боюсь, что буду использовать его для неправильной цели.

Любые просвещения будут оценены по достоинству.

EDIT (вымышленная схема).

Что делать, если сообщение изменяется? или даже имя пользователя display_name?

CREATE TABLE users (
    id uuid, 

    display_name text, 

    PRIMARY KEY ((id)) 
); 

CREATE TABLE posts (
    id uuid, 

    post text, 
    poster_id uuid, 
    poster_display_name text 
    tags set<text>, 
    statistics map<int, bigint>, 

    PRIMARY KEY ((id)) 
); 

CREATE TABLE posts_by_user (
    user_id uuid, 
    created timeuuid, 

    post text, 
    post_id uuid, 
    tags set<text>, 
    statistics map<int, bigint>, 

    PRIMARY KEY ((id), created) 
); 
+0

Если вы можете добавить схему таблицы, которая будет полезна. –

+0

Добавлена ​​вымышленная схема. – Droritos

+0

Должны ли мы изменить заголовок на «денормализованные данные» вместо «дублированных данных»? –

ответ

1

Это зависит от частоты обновлений. Например, если пользователи редко обновляют свои имена нечасто (несколько минут на учетную запись пользователя), тогда может быть полезно использовать вторичный индекс. Просто знайте, что использование 2i - сборка рассеяния, поэтому вы увидите проблемы с производительностью, если это обычная операция. В таких случаях вы хотите использовать материализованное представление (либо в версии 3.0, либо самостоятельно управлять им), чтобы иметь возможность получать список всех сообщений для данного пользователя, а затем обновлять отображаемое имя пользователя.

Я рекомендую сделать это в фоновом задании и дать пользователю сообщение типа «может потребоваться [некоторая единица времени], чтобы изменение вашего имени отражалось везде».