Советы по экспорту данных пользователей

Когда пользователям требуются кастомизированные или детализированные экспорты данных, выходящие за рамки базового экспорта данных пользователя, доступного на странице их настроек, администраторы могут выполнять экспорт данных пользователей с помощью плагина Data Explorer.

Этот процесс включает написание и выполнение SQL-запросов, адаптированных под конкретные потребности в данных, при обеспечении соблюдения политики сайта и нормативных требований по защите данных.

Администраторы также могут захотеть экспортировать данные пользователей по другим причинам, например:

  • Анализ вовлеченности пользователей:
    • Анализ взаимодействия пользователей с сайтом, определение популярных постов и тем, получающих наибольшее количество ответов.
  • Генерация отчетов:
    • Создание кастомных отчетов для заинтересованных лиц для предоставления информации о метриках сообщества и вовлеченности пользователей.
  • Резервное копирование данных:
    • Сохранение резервных копий данных пользователей для целей восстановления или исторического анализа.
  • Миграция данных:
    • Экспорт данных пользователей при переходе на другую платформу или создании хранилища данных.
  • Модерация контента:
    • Расследование активности пользователей или контента в случае нарушений политики или споров.

Ключевые соображения при написании запросов для экспорта данных пользователей

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

Вот некоторые факторы и соображения, которые могут повлиять на то, как пишутся запросы для экспорта данных пользователей:

  1. Атрибуты пользователя:
  • Если вам нужны конкретные атрибуты пользователя, такие как имя пользователя, электронная почта или дата регистрации, ваш запрос должен явно выбирать эти столбцы из базы данных. Например:
SELECT username, email, created_at AS registration_date
FROM users
WHERE id = :user_id
  1. Данные активности:
  • Для экспорта данных активности пользователей, таких как посты, лайки или история входов, потребуются дополнительные соединения с соответствующими таблицами (например, posts, likes, user_actions):
SELECT p.id AS post_id, p.topic_id, p.created_at AS post_date, u.username
FROM posts p
JOIN users u ON u.id = p.user_id
WHERE u.id = :user_id
  1. Диапазон дат:
  • Если вам нужны данные за определенный период времени, включите фильтры по датам в ваш запрос, чтобы ограничить результаты соответствующим периодом:
SELECT username, email, created_at AS registration_date
FROM users
WHERE created_at BETWEEN :start_date AND :end_date
  1. Конфиденциальность данных:
  • Убедитесь, что экспортируемые данные соответствуют законам о защите данных и политике сайта. Будьте осторожны при включении конфиденциальных данных, если это не абсолютно необходимо.
  1. Анонимизация:
  • В некоторых случаях может потребоваться анонимизация данных пользователей для защиты их конфиденциальности. Например, вы можете заменить имена на уникальные идентификаторы.
  1. Согласие пользователя:
  • Убедитесь, что существует механизм явного согласия, если экспорт данных включает обмен личной или конфиденциальной информацией пользователей.

Примеры запросов

Ниже приведены примеры запросов для распространенных потребностей в экспорте данных. Эти запросы разработаны так, чтобы быть похожими на экспорт данных, доступный со страницы настроек пользователя:

Экспорт информации о пользователе:

-- [params]
-- int :user_id

SELECT id, username, email, created_at AS registration_date
FROM users
WHERE id = :user_id

Экспорт постов

-- [params]
-- int :user_id

SELECT 
    id,
    topic_id,
    post_number,
    created_at,
    updated_at,
    reply_to_post_number,
    reply_count,
    quote_count,
    deleted_at,
    like_count,
    incoming_link_count,
    bookmark_count,
    score,
    reads,
    post_type,
    sort_order,
    last_editor_id,
    hidden,
    hidden_reason_id,
    notify_moderators_count,
    spam_count,
    illegal_count,
    inappropriate_count,
    last_version_at,
    user_deleted,
    reply_to_user_id,
    percent_rank,
    notify_user_count,
    like_score,
    deleted_by_id,
    word_count,
    version,
    cook_method,
    wiki,
    baked_at,
    baked_version,
    hidden_at,
    self_edits,
    reply_quoted,
    via_email,
    public_version,
    locked_by_id,
    image_upload_id,
    qa_vote_count,
    raw,
    cooked,
    edit_reason,
    raw_email,
    action_code,
    outbound_message_id
FROM 
    posts
WHERE 
    user_id = :user_id
ORDER BY 
    created_at DESC

Экспорт журналов токенов авторизации:

-- [params]
-- int :user_id

SELECT 
    path,
    action,
    user_auth_token_id,
    client_ip,
    user_agent,
    auth_token,
    created_at
FROM 
    user_auth_token_logs
WHERE 
    user_id = :user_id

Экспорт токенов авторизации:

-- [params]
-- int :user_id

SELECT 
    auth_token,
    client_ip,
    rotated_at,
    created_at,
    updated_at,
    seen_at,
    auth_token_seen,
    user_agent,
    prev_auth_token
FROM 
    user_auth_tokens
WHERE 
    user_id = :user_id

Экспорт значков пользователя:

-- [params]
-- int :user_id

SELECT 
    notification_id,
    badge_id,
    granted_at,
    granted_by_id,
    post_id,
    seq,
    featured_rank,
    created_at,
    is_favorite
FROM 
    user_badges
WHERE 
    user_id = :user_id

Экспорт закладок пользователя:

-- [params]
-- int :user_id

SELECT 
    name,
    reminder_at,
    created_at,
    updated_at,
    reminder_last_sent_at,
    reminder_set_at,
    auto_delete_preference,
    pinned,
    bookmarkable_id,
    bookmarkable_type
FROM 
    bookmarks
WHERE 
    user_id = :user_id

Экспорт предпочтений категорий:

-- [params]
-- int :user_id

SELECT 
    category_id,
    notification_level,
    last_seen_at
FROM 
    category_users
WHERE 
    user_id = :user_id

Экспорт флагов:

-- [params]
-- int :user_id

SELECT 
    id,
    name,
    name_key,
    description,
    notify_type,
    auto_action_type,
    custom_type,
    applies_to,
    position,
    enabled,
    created_at,
    updated_at,
    score_type
FROM 
    flags
WHERE 
    id IN (
        SELECT 
            post_action_type_id 
        FROM 
            post_actions 
        WHERE 
            user_id = :user_id
    )

Экспорт лайков:

-- [params]
-- int :user_id

SELECT 
    post_id,
    post_action_type_id,
    created_at,
    updated_at,
    deleted_at,
    deleted_by_id,
    related_post_id,
    staff_took_action,
    deferred_by_id,
    targets_topic,
    agreed_at,
    agreed_by_id,
    deferred_at,
    disagreed_at,
    disagreed_by_id
FROM 
    post_actions
WHERE 
    user_id = :user_id
    AND post_action_type_id = 1

Экспорт предпочтений пользователя:

-- [params]
-- int :user_id

SELECT 
    mailing_list_mode,
    email_digests,
    external_links_in_new_tab,
    enable_quoting,
    dynamic_favicon,
    automatically_unpin_topics,
    digest_after_minutes,
    auto_track_topics_after_msecs,
    new_topic_duration_minutes,
    last_redirected_to_top_at,
    email_previous_replies,
    email_in_reply_to,
    like_notification_frequency,
    include_tl0_in_digests,
    mailing_list_mode_frequency,
    notification_level_when_replying,
    theme_key_seq,
    allow_private messages,
    homepage_id,
    theme_ids,
    hide_profile_and_presence,
    text_size_key,
    text_size_seq,
    email_level,
    email_messages_level,
    title_count_mode_key,
    enable_defer,
    timezone,
    enable_allowed_pm_users,
    dark_scheme_id,
    skip_new_user_tips,
    color_scheme_id,
    default_calendar,
    chat_enabled,
    only_chat_push_notifications,
    oldest_search_log_date,
    chat_sound,
    dismissed_channel_retention_reminder,
    dismissed_dm_retention_reminder,
    bookmark_auto_delete_preference,
    ignore_channel_wide_mention,
    chat_email_frequency,
    enable_experimental_sidebar,
    seen_popups,
    chat_header_indicator_preference,
    sidebar_link_to_filtered_list,
    sidebar_show_count_of_new_items,
    watched_precedence_over_muted,
    chat_separate_sidebar_mode,
    topics_unread_when_closed,
    policy_email_frequency,
    show_thread_title_prompts,
    auto_image_caption
FROM 
    user_options
WHERE 
    user_id = :user_id

Экспорт постов в очереди:

-- [params]
-- int :user_id

SELECT 
    id,
    user_id,
    topic_id,
    post_number,
    raw,
    created_at,
    updated_at,
    state,
    error,
    queue
FROM 
    queued_posts
WHERE 
    user_id = :user_id

Экспорт архива пользователя:

-- [params]
-- int :user_id

SELECT 
    id,
    topic_id,
    created_at,
    updated_at
FROM 
    user_archived_messages
WHERE 
    user_id = :user_id

Экспорт посещений пользователя:

-- [params]
-- int :user_id

SELECT 
    visited_at,
    posts_read,
    mobile,
    time_read
FROM 
    user_visits
WHERE 
    user_id = :user_id

Для получения дополнительной информации о создании и выполнении запросов для экспорта данных обратитесь к документации по плагину Discourse Data Explorer и категории #data-reporting::category.

7 лайков