Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:如何识别子表中的行?_Postgresql - Fatal编程技术网

PostgreSQL:如何识别子表中的行?

PostgreSQL:如何识别子表中的行?,postgresql,Postgresql,首先,请原谅我是一个数据库设计新手 假设我将表格簿定义为: id: integer (autoincremented) title: string 我想创建一个包含书籍注释的表。我提出了两种可能的方法来定义注释表: 选择1 选择2 我发现选项1是最简单的,因为主键只是一个数字。缺点是我需要一个64位整数,这可能是32位PHP平台的问题,甚至在Rails中,更改ActiveRecord自动添加的id列的默认类型有点棘手 另一方面,选项2需要一个恼人的双整数主键,该主键必须由触发器函数维护。但是,

首先,请原谅我是一个数据库设计新手

假设我将表格簿定义为:

id: integer (autoincremented)
title: string
我想创建一个包含书籍注释的表。我提出了两种可能的方法来定义注释表:

选择1 选择2 我发现选项1是最简单的,因为主键只是一个数字。缺点是我需要一个64位整数,这可能是32位PHP平台的问题,甚至在Rails中,更改ActiveRecord自动添加的id列的默认类型有点棘手

另一方面,选项2需要一个恼人的双整数主键,该主键必须由触发器函数维护。但是,它使用了友好的32位整数,并且在逻辑上更适合于第123册注释2表的嵌套结构,而不是选项1中的注释2222

两个选项中哪一个是最好的?两者都一样好吗?有没有其他更好的方法来达到同样的目的


谢谢

这可能是一个意见问题,但我肯定会选择选项1,因为如果您希望在某个时候能够为评论分配一些内容,例如投票,那么选项1更容易、更干净,并且补偿效果更好。在这种情况下,选项2需要投票表上的复合外键-没有错,但也不漂亮。

在示例2中,您可以使用时间戳而不是整数。
复合关键成员的顺序取决于应用程序的业务逻辑,如果书籍很重要,那么它就是索引的第一个成员。

将注释PK作为注释id整数和书籍id的组合,而不使用触发器,怎么样?创建表book\u comment id serial,book\u id int references bookid,comment text,constraint myck主键id,book\u id;没有必要使用触发器。串行处理。@Jayadevan,AFAIK串行不会按分区递增。这意味着,如果我们假设comment.id是一个整数,而不是一个大整数,它将溢出。请注意,如果我们有4个MILIN书籍,并且每本书有1000个评论认为这些值在其他应用程序中,而不是在图书馆中是合理的,那么我们需要一个64位ID。
id: BIG integer (autoincremented) #Here I use BIGINT because 32 bits are not enough to handle all possible comments for all books
book: integer (foreign key to books.id)
text: string 

PRIMARY KEY: id
book: integer (foreign key to books.id)
index: integer (incremented by the 'before create' trigger on table `comments`)
text: string

PRIMARY KEY: (book, index)