2015-05-07 112 views
2

我有一张用于留言板的表格(见下文)。我知道最佳做法决定创建一个Primary Key,但我看不出有什么理由去创建一个。我将主要搜索(UID, GRP_ID)并将创建一个索引。删除将基于Last_timestp。在这种情况下,应该有一个PK没有主键的数据库表

CREATE TABLE CP.CHAT 
(UID BIGINT NOT NULL, GRP_ID BIGINT NOT NULL, CHAT VARCHAR(200) NOT NULL, LAST_TIMESTP TIMESTAMP); 
+0

但是不太可能,你可以有idential LAST_TIMESTP值多行;正如LeBarton在他的回答中所说的那样,简单的自动增量id字段占用的空间量是可以忽略的。此外,对于用户或组ID,“BIGINT”可能是* EXTREME *矫枉过正;它可能甚至是矫枉过正的自动递增主键。 “INT”是一半的大小;您可以将ID,UID和GRP_ID设置为INT,并且表格将比您在上面定义的小。 – Uueerdo

回答

0

主键不是必需的,并且您的表格可以正常工作。

以下是我几乎总是使用主键的一些原因。

  1. 它们让您唯一地定位一行。如果您有多个具有完全相同数据的行,将其删除可能非常繁琐。

  2. 它们为表提供隐式排序。如果您对数据库进行故障排除,则按键顺序会告诉您它们的创建顺序。

最终,由PK占用的空间在存储空间方面不会是一个巨大的数据库开销。它不会受到伤害,但它可以帮助它。

+0

只是为了迂腐,除非它们是自动增量(或类似处理),否则它们并不意味着排序;我不相信自动增量也会正式保证序列(但在我的经验中,这对于这个目的来说非常可靠)。 – Uueerdo

+0

有一种感觉,我不会需要PK,但只需要确定。谢谢 – user4094170

0

我不需要告诉你主键是什么以及它用于什么。看起来你已经知道了,并找出结构很好。

事情是,如果你不会有任何其他表依赖于这张表,那么你的表设置将足够你。因为你已经有了一个UID列,所以我说我会让它成为PK,因为它在存储方面不会花费太多,但也可以帮助你对表进行排序(通过自动递增整数),并且可以作为可以选择删除和​​更新操作。

还是没能找出你将如何管理由Last_timestp值删除记录,但...

+0

我假定UID是指示创建该消息的用户,所以它不会工作,原因很明显。 – Uueerdo

+0

Oww ...无法猜测这是用户表的外键,对不起:) – ilter

+0

我本可以发出最初指定的问题,但我必须从提问者提供的上下文中假定它。 – Uueerdo