【问题标题】:How to store array of tables in Schema如何在Schema中存储表数组
【发布时间】:2020-04-10 13:11:01
【问题描述】:

所以我是一名学生,目前正在学习 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 种不同的股票?

【问题讨论】:

  • 使用 4 个空格字符缩进来自动格式化您的代码 sn-ps。我为你做了那个编辑。欢迎来到 Stack Overflow。
  • 您的标题似乎不适合您的问题正文。
  • 请修正您的标题以匹配问题。

标签: sql postgresql database-design many-to-many database-normalization


【解决方案1】:

听起来像是经典的多对多关系。根本不应该涉及数组。假设 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)
);

详细解释:

种子

Postgres 提供generate_series() 方便地生成行。 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 只股票生成 10 亿行。需要一些时间并占用一些空间。

如何为每个用户存储 100 种不同的股票?

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 之间。

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

【讨论】:

  • 谢谢你的解释,真的很有帮助
  • 嗨 Erwin,你用什么来格式化你的 SQL 语句?您是手动还是使用工具?
  • @ErwinRooijakkers:我主要是手工完成的。看起来很乏味,但它帮助我处理、构建和理解复杂的查询很多。我更喜欢这种紧凑的形式,而不是各种客户端和框架的经常嘈杂的格式。实际上,我喜欢 INSERT 的这种特殊格式(请参阅更新),以一目了然地查看哪个表达式进入哪个列。
【解决方案2】:
CREATE TABLE user (
  user_id INTEGER NOT NULL,   
  stocks text[], 
  PRIMARY KEY (user_id)
);

在您的 Stock 表中存储主键列表,以便您可以使用 select 语句轻松查找它们的值。

如果您愿意,您可以将数组设为二维并存储值。但我敢肯定,这违反了某些原则,因为您已经有一个用于此目的的表。

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2010-10-24
    • 1970-01-01
    相关资源
    最近更新 更多