SQL社交网络,保留消息的正确方式?

SQL社交网络,保留消息的正确方式?,sql,Sql,我正在建立一个社交网络,现在我面临一个问题 那么,哪一个保存消息更快: 要有一个数据库, 以及为每个新用户的消息创建新表 像这样: CREATE DATABASE 'user_messages'; CREATE TABLE 'user_id' ( id int(32) NOT NULL PRIMARY KEY, new ENUM ('Y', 'N') NOT NULL DEFAULT 'Y', time timestamp NOT NULL, from_id

我正在建立一个社交网络,现在我面临一个问题

那么,哪一个保存消息更快: 要有一个数据库, 以及为每个新用户的消息创建新表

像这样:

CREATE DATABASE 'user_messages';

CREATE TABLE 'user_id' (

    id int(32) NOT NULL PRIMARY KEY,
    new ENUM ('Y', 'N') NOT NULL DEFAULT 'Y',
    time timestamp NOT NULL,
    from_id int(32)
);
INSERT INTO 'user_messages' (id, new, time, from_id) VALUES ('id_value', 'Y', now(), 'friend_id');
或者

使用复制将所有邮件保留在一个表中??? 使用索引 如果有十亿行呢? 像这样:

CREATE DATABASE 'user_messages';

CREATE TABLE 'user_id' (

    id int(32) NOT NULL PRIMARY KEY,
    new ENUM ('Y', 'N') NOT NULL DEFAULT 'Y',
    time timestamp NOT NULL,
    from_id int(32)
);
INSERT INTO 'user_messages' (id, new, time, from_id) VALUES ('id_value', 'Y', now(), 'friend_id');

如果不始终使用动态生成的SQL,每个用户创建一个表将成为查询的噩梦


一个更好的选择是创建一个表,并使用一个外键将该表中所有用户的所有消息存储回users表。外键将被编入索引,并且不会出现严重的性能问题。如果您认为您将拥有数十亿行或消息,那么您的数据库结构应该相应地进行缩放以处理这些数据量,但您的数据库设计不应该因此而改变。

如果不始终使用动态生成的SQL,则为每个用户创建一个表将成为查询的噩梦

一个更好的选择是创建一个表,并使用一个外键将该表中所有用户的所有消息存储回users表。外键将被编入索引,并且不会出现严重的性能问题。如果您认为您将拥有数十亿行或消息,那么您的数据库架构应该相应地进行缩放以处理这些数据量,但是您的数据库设计不应该因此而改变

那么,哪一个保存消息更快:

虽然我怀疑SQLServer对表的上限明显小于对行的上限,但两者都不可能更快。我不知道您是否会因为跨不同数据库的事务而降低性能

正确的数据库设计将决定单个表

使用索引如果有十亿行怎么办?像这样:

CREATE DATABASE 'user_messages';

CREATE TABLE 'user_id' (

    id int(32) NOT NULL PRIMARY KEY,
    new ENUM ('Y', 'N') NOT NULL DEFAULT 'Y',
    time timestamp NOT NULL,
    from_id int(32)
);
INSERT INTO 'user_messages' (id, new, time, from_id) VALUES ('id_value', 'Y', now(), 'friend_id');
嗯,也许在你开始解决这个问题之前,你应该先看10亿行。但是请注意,您可以出于许多原因(通常是出于性能原因)在GoogleSQLServer表分区中对数据进行分区

那么,哪一个保存消息更快:

虽然我怀疑SQLServer对表的上限明显小于对行的上限,但两者都不可能更快。我不知道您是否会因为跨不同数据库的事务而降低性能

正确的数据库设计将决定单个表

使用索引如果有十亿行怎么办?像这样:

CREATE DATABASE 'user_messages';

CREATE TABLE 'user_id' (

    id int(32) NOT NULL PRIMARY KEY,
    new ENUM ('Y', 'N') NOT NULL DEFAULT 'Y',
    time timestamp NOT NULL,
    from_id int(32)
);
INSERT INTO 'user_messages' (id, new, time, from_id) VALUES ('id_value', 'Y', now(), 'friend_id');
嗯,也许在你开始解决这个问题之前,你应该先看10亿行。但是请注意,您可以出于许多原因(通常是出于性能原因)在GoogleSQLServer表分区中对数据进行分区