如何在 Schema 中存储表数组
How to store array of tables in Schema
所以我是一名学生,目前正在学习 PostgreSQL。我想弄清楚如何随机播种数据。我有 1000 万用户和 100 只股票。
目前我的表格如下所示:
CREATE TABLE user (
user_id INTEGER NOT NULL,
amount_of_stocks [][] array, -- this is just assumption
PRIMARY KEY (user_id)
);
CREATE TABLE stock (
stock_id INTEGER NOT NULL,
amount_per_stock INT,
quantity INT
PRIMARY KEY (stock_id)
);
我如何为每个用户存储 100 种不同的股票?
CREATE TABLE user (
user_id INTEGER NOT NULL,
stocks text[],
PRIMARY KEY (user_id)
);
在您的 Stock table 中存储主键列表,以便您可以使用 select 语句轻松查找它们的值。
如果您愿意,可以使数组成为二维数组,并存储值..但这违反了一些原则,我敢肯定,因为您已经有一个用于该目的的 table。
听起来像是经典的多对多关系。根本不应该涉及数组。假设 Postgres 10 或更高版本,请使用以下内容:
CREATE TABLE users ( -- "user" is a reserved word!
user_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, username text UNIQUE NOT NULL -- or similar
);
CREATE TABLE stock (
stock_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, stock text UNIQUE NOT NULL -- or similar
);
CREATE TABLE user_stock (
user_id int REFERENCES users
, stock_id int REFERENCES stock
, amount int NOT NULL
, PRIMARY KEY (user_id, stock_id)
);
详细解释:
- How to implement a many-to-many relationship in PostgreSQL?
- Auto increment table column
种子
Postgres提供generate_series()
to conveniently generate rows. random()
生成随机数的工具:
INSERT INTO users(username)
SELECT 'user_' || g
FROM generate_series(1, 10000000) g; -- 10M (!) - try with just 10 first
INSERT INTO stock(stock)
SELECT 'stock_' || g
FROM generate_series(1, 100) g;
首先对少量用户进行试验。 1000 万用户 * 100 只股票生成十亿行。需要一些时间,占用一些 space.
How would I store 100 different stocks for each user?
INSERT INTO user_stock
(user_id, stock_id, amount)
SELECT u.user_id, s.stock_id, ceil(random() * 1000)::int
FROM users u, stock s; -- cross join
每个用户获得 100 支 不同的 股票 - 虽然在这个基本示例中每个人都获得相同的集合,但您没有更紧密地定义。我为每只股票添加了 1 到 1000 之间的随机数量。
关于产生笛卡尔积的交叉连接:
所以我是一名学生,目前正在学习 PostgreSQL。我想弄清楚如何随机播种数据。我有 1000 万用户和 100 只股票。
目前我的表格如下所示:
CREATE TABLE user (
user_id INTEGER NOT NULL,
amount_of_stocks [][] array, -- this is just assumption
PRIMARY KEY (user_id)
);
CREATE TABLE stock (
stock_id INTEGER NOT NULL,
amount_per_stock INT,
quantity INT
PRIMARY KEY (stock_id)
);
我如何为每个用户存储 100 种不同的股票?
CREATE TABLE user (
user_id INTEGER NOT NULL,
stocks text[],
PRIMARY KEY (user_id)
);
在您的 Stock table 中存储主键列表,以便您可以使用 select 语句轻松查找它们的值。
如果您愿意,可以使数组成为二维数组,并存储值..但这违反了一些原则,我敢肯定,因为您已经有一个用于该目的的 table。
听起来像是经典的多对多关系。根本不应该涉及数组。假设 Postgres 10 或更高版本,请使用以下内容:
CREATE TABLE users ( -- "user" is a reserved word!
user_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, username text UNIQUE NOT NULL -- or similar
);
CREATE TABLE stock (
stock_id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY
, stock text UNIQUE NOT NULL -- or similar
);
CREATE TABLE user_stock (
user_id int REFERENCES users
, stock_id int REFERENCES stock
, amount int NOT NULL
, PRIMARY KEY (user_id, stock_id)
);
详细解释:
- How to implement a many-to-many relationship in PostgreSQL?
- Auto increment table column
种子
Postgres提供generate_series()
to conveniently generate rows. random()
生成随机数的工具:
INSERT INTO users(username)
SELECT 'user_' || g
FROM generate_series(1, 10000000) g; -- 10M (!) - try with just 10 first
INSERT INTO stock(stock)
SELECT 'stock_' || g
FROM generate_series(1, 100) g;
首先对少量用户进行试验。 1000 万用户 * 100 只股票生成十亿行。需要一些时间,占用一些 space.
How would I store 100 different stocks for each user?
INSERT INTO user_stock
(user_id, stock_id, amount)
SELECT u.user_id, s.stock_id, ceil(random() * 1000)::int
FROM users u, stock s; -- cross join
每个用户获得 100 支 不同的 股票 - 虽然在这个基本示例中每个人都获得相同的集合,但您没有更紧密地定义。我为每只股票添加了 1 到 1000 之间的随机数量。
关于产生笛卡尔积的交叉连接: