为每个新用户/项目创建/更改表

时间:2018-06-22 23:28:33

标签: postgresql database-design database-performance create-table alter

我正在建立一个具有两种用户的平台:Users_A创建具有关联的唯一虚拟硬币的项目,而Users_B可以购买和交换这些硬币。

问题:

  • 方法1:如果我使用一个唯一的表作为虚拟钱包,则User_B ID将是行,而每一列将是每个硬币。这样,每次创建新项目时我都必须更改表。
  • 方法2:我为每个User_B创建一个电子钱包(表)。

这两者中哪一个在性能上更差/更好? 还有其他可能的方法吗?

1 个答案:

答案 0 :(得分:0)

对我来说还不清楚您到底想建模什么。但是,由于您向数据库添加了新内容而需要更改表的任何模型都是有缺陷的。

听起来对我来说是一种基本的多对多关系:

您肯定需要为用户提供一个表:

create table users 
(
   user_id integer primary key, 
  ... other columns ...
);

,其中一个用于不同的硬币:

create table coin
(
  coin_id integer primary key, 
  ... other columns ...
);

您需要一个项目表。您说“关联的唯一虚拟硬币”,所以我假设一个项目只处理一种硬币:

create table project
(
   project_id     integer primary key, 
   owner_user_id  integer not null references users,
   coin_id        integer not null references coin
   ... other columns 
);

我不确定您对“买卖”硬币的确切含义,但是您可能需要类似转帐表的东西:

create table coin_transfer
(
   from_user_id   integer not null references users,
   to_user_id     integer not null references users, 
   project_id     integer not null references project,
   transfer_type  text    not null check (transfer_type in ('buy', 'exchange'))
   amount         numeric not null
);

您还提到了属于用户的“钱包”。您永远不会为每个钱包创建一个表,而是一个包含用户拥有该钱包信息的表。假设每种硬币的每个用户都有一个钱包,则需要这样的东西:

create table wallet
(
  wallet_id      integer primary key, 
  owner_user_id  integer not null references users, 
  coin_id        integer not null references coin,
   ... other columns ...
);

以上只是一个非常粗略的草图,因为您的问题中缺少很多信息。