使用 PostgreSQL 实现消息应用程序的两个数据库

问题描述 投票:0回答:1

我的消息应用程序有 2 个使用 PostgreSQL 的实现。

首次实施:

CREATE TYPE conversation_message_t AS (
        user_id integer,
        submitted_at timestamp(0) with time zone,
        content text
    );

    CREATE TABLE "conversation"(
        "submitted_at" timestamp with time zone NOT NULL DEFAULT NOW()::timestamptz(6),
        "messages" []conversation_message_t NOT NULL DEFAULT '{}',
        PRIMARY KEY("submitted_at")
    );
    
    <!-- For inserting a new message: -->
    UPDATE "conversation" SET "messages"=ARRAY_APPEND(
        "messages", ROW(5,NOW(),'hello')::conversation_message_t)
    WHERE "submitted_at"='...'
    
    <!-- For selecting messages from 5 to 100: -->
    SELECT ARRAY(SELECT "messages"[n]."content" FROM generate_series(5, 100) AS "messages"(n))
    FROM "conversation"
    WHERE "submitted_at"='...';

这里我只有一张桌子(

conversation
),还有一个 每次对话的消息数组 该数组将针对新消息进行更新。 它看起来棒极了,没有任何问题!但是当我们有超过 1000 万次对话时 而且每个对话都有超过100亿条消息,追加新消息会有问题吗?

第二次实施:

CREATE TABLE "conversation"(
        "submitted_at" timestamp with time zone NOT NULL DEFAULT NOW()::timestamptz(6),
        PRIMARY KEY("submitted_at")
    );
    CREATE TABLE "conversation_message"(
        "conversation_submitted_at" timestamp with time zone NOT NULL,
        "submitted_at" timestamp with time zone NOT NULL,
        "user_id" integer NOT NULL,
        "content" text NOT NULL,
        PRIMARY KEY("conversation_submitted_at","submitted_at")
    );

这里我觉得大数据会有问题(空间问题和内存问题) 因为每条消息都有一个不必要的主键(我们从不通过主键搜索消息!) 而且由于每条消息都要重复“

conversation_submitted_at
”,因此占用了太多空间!但如果你是我,你会选择哪种实现?为什么?还有什么更好的办法吗?

PostgreSQL 数组可以处理大量元素吗? (100 亿)

sql database postgresql database-design
1个回答
0
投票

这不是我的最佳答案,但请尝试思考,也许您不需要使用 SQL 数据库来完成此任务? NoSQL 数据库怎么样?

© www.soinside.com 2019 - 2024. All rights reserved.