2009-09-27 92 views
0

我正在将一个字符串保存到一个表中,它必须是唯一的,我将在保存之前检查它是否已经存在。这不是其他领域。单列或两列?

我可以只有一个字符串作为主键的列表,或者我应该有一个唯一标识符ID列吗?为何在这两种情况下?

回答

6

如果你的字符串是唯一的(并且将永远是唯一的),那么把它作为唯一的列和主键就可以了。

我会用一个单独的ID的唯一原因是,如果任一

  1. 将成为在未来的某个时刻非唯一的;或
  2. 如果它是一个大字符串,并且您希望另一个表列引用它(外键)。

我会将YAGNI原理应用于这两种情况,并在发生这种情况时担心。另外,对于数据库应用程序,最好不要“在保存之前检查它是否已经存在”。我倾向于试图保存它,并在存在的情况下捕获错误。由于它是一个主键(或唯一约束),这将起作用。

检查是否存在,然后插入通常会导致竞争条件。

+0

+1依靠一个唯一的约束,而不是编码手动检查。 – APC 2009-09-27 23:48:06

2

字符串可以更改吗? 字符串的长度是多少(重要的是如果其他表将把它用作外键)?

通常,如果该值可能发生变化,或者您需要其他表与其相关联,那么我会建议有一个指定的ID字段。

1

如果字符串始终是唯一的,那么应该只使用一列。为了节省空间(尽管可能很少),您不需要另一个ID列。将唯一ID约束添加到列以仅强制唯一值。

如果您想检查值是否存在,那么它取决于您。尽管始终通过唯一的ID错误不是检查表中是否存在该值的正确方法。保存实际错误的错误处理并手动进行检查。例外情况可能会造成很小的性能下降,应该保留用于真正的程序例外,而不是常规。

但是,如果由于某种原因,字符串将在另一列中被引用,我会创建一个ID字段。如果字符串长度为32个字符,则每个记录需要32个字节的空间(假定为ASCII)。作为主键的32位int只需要4个字节(32/8 = 4)。因此,如果您在另一个表中引用字符串,则您将通过使用整数ID节省空间。另外,如果您使用整数ID作为主键,您可以查看按字符串对索引进行聚类(如果您将通过字符串而不是ID进行大量查找)。在这种情况下,按字符串而不是主键进行分组可能会对性能有很大的影响。

1

你确定这个字符串是唯一的吗?没有人会永远能够改变它?如果是这样就没问题。其他人只需使用编号