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

时间:2014-09-11 11:39:16

标签: postgresql

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

假设我将表books定义为:

id: integer (autoincremented)
title: string

我想创建一个包含有关书籍评论的表格。我提出了两种可能的方法来定义comments表:

选项1

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

选项2

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

PRIMARY KEY: (book, index)

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

另一方面, OPTION 2 需要一个恼人的双整数主键,必须由触发函数维护。然而,它使用友好的32位整数,并且在表的嵌套结构中更好地逻辑拟合(第123页的注释2,而不是在选项1的情况下注释2222书123)。

哪两个选项最好?两者都同样好吗?是否有另一种更好的方法来达到同样的目的?

谢谢!

2 个答案:

答案 0 :(得分:0)

可能是一个意见问题,但我肯定会选择选项1,因为它更容易,更清晰,更好的抵消,如果你在某个时候希望能够为评论指定一些内容 - 例如票。在这种情况下,选项2需要在投票表上使用复合外键 - 没有错,但也不是很漂亮。

答案 1 :(得分:0)

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