Postgresql 如何向关系数据库表中添加额外的列?

Postgresql 如何向关系数据库表中添加额外的列?,postgresql,database-design,Postgresql,Database Design,我有一个表ABC,它有一些核心列。我想有一些额外的列取决于用户。例如,user1可能有b、c、d列,而user2可能有c、d、f列 我应该在同一个表中添加列(ABC),还是应该为额外的列添加另一个表,其中每个行表示具有以下结构的列: |ABCId|列名|列值|这两种方法都是可行的 将列放在一个表中的优点基本上是简单。很容易访问这些列。如果记录不使用列,则值为NULL 不利因素可能是性能。固定宽度的数据类型(如整数)通常会占用数据页上的空间,即使NULL(尽管这取决于数据库)。因此,未使用的值仍然

我有一个表ABC,它有一些核心列。我想有一些额外的列取决于用户。例如,user1可能有b、c、d列,而user2可能有c、d、f列

我应该在同一个表中添加列(ABC),还是应该为额外的列添加另一个表,其中每个行表示具有以下结构的列:


|ABCId|列名|列值|

这两种方法都是可行的

将列放在一个表中的优点基本上是简单。很容易访问这些列。如果记录不使用列,则值为
NULL

不利因素可能是性能。固定宽度的数据类型(如整数)通常会占用数据页上的空间,即使
NULL
(尽管这取决于数据库)。因此,未使用的值仍然会使记录变大。(这可能适用于字符串,也可能不适用于字符串。)更宽的记录需要更多的空间,这可能会降低某些操作的数据库性能。这在柱状数据库中不是问题

另一种选择是有一个单独的表。因为存在一对一的关系,所以这两个表应该具有相同的主键。这也是可行的——在两种情况下,这可能是性能上的胜利:

  • 当大多数行在列中没有值时
  • 当许多查询不需要额外的列时

但这两种方法都是合理的。根据其他因素,一个或另一个可能更合理。

@Gorgon Linoff我尝试使用单独的表,但这成为使用基于行的列的性能瓶颈。因为假设一个用户平均有20个额外的列,这意味着额外的列表中有20行。当用户达到200万时,加入这两个表将使服务器崩溃。@ShiranAbbasi。我建议两个表都有相同的主键。@Gorgon Linoff怎么会这样呢?因为extra columns表将具有来自不同列的主表的重复IDvalues@ShiranAbbasi . . . 一个表可以有一个主键,该主键是对另一个表的外键引用。@Gorgon Linoff在这种情况下,外键不能成为主键,因为它将重复。ABCId将对多个额外列重复。