如何在 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 之间的随机数量。

关于产生笛卡尔积的交叉连接: