我的消息应用程序有 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 数据库来完成此任务? NoSQL 数据库怎么样?