首先,请原谅我是一名数据库设计新手。
假设我将表books
定义为:
id: integer (autoincremented)
title: string
我想创建一个包含有关书籍评论的表格。我提出了两种可能的方法来定义comments
表:
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)
我发现 OPTION 1 是最简单的一个,因为主键只是一个数字。缺点是我需要64位整数,这可能是32位PHP平台甚至Rails中的一个问题(其中更改ActiveRecord自动添加的id
列的默认类型有点棘手) 。
另一方面, OPTION 2 需要一个恼人的双整数主键,必须由触发函数维护。然而,它使用友好的32位整数,并且在表的嵌套结构中更好地逻辑拟合(第123页的注释2,而不是在选项1的情况下注释2222书123)。
哪两个选项最好?两者都同样好吗?是否有另一种更好的方法来达到同样的目的?
谢谢!
答案 0 :(得分:0)
可能是一个意见问题,但我肯定会选择选项1,因为它更容易,更清晰,更好的抵消,如果你在某个时候希望能够为评论指定一些内容 - 例如票。在这种情况下,选项2需要在投票表上使用复合外键 - 没有错,但也不是很漂亮。
答案 1 :(得分:0)
您可以在示例2中使用timestamp而不是integer。 复合关键成员的顺序取决于您的应用程序的业务逻辑,如果该书很重要,那么它就是索引的第一个成员。