单列字符串还是两列?

时间:2009-09-27 23:27:16

标签: database-design

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

我可以只使用一个以字符串作为主键的列表,还是应该有一个唯一标识符ID列?为什么在这两种情况下?

4 个答案:

答案 0 :(得分:6)

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

我使用单独ID的唯一原因是

  1. 它将在未来的某个时刻变得不独特;或
  2. 如果它是一个大字符串,并且您希望另一个表列引用它(外键)。
  3. 我会将YAGNI原则应用于这两种情况,并在发生时对其进行担心。

    另外,对于数据库应用程序,最好不要“在保存它之前检查它是否已经存在”。我倾向于只是尝试保存它并捕获错误,如果它存在的alredy。由于它是主键(或唯一约束),因此可以使用。

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

答案 1 :(得分:2)

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

通常,如果值可以更改,或者您需要其他表与之关联,我建议您使用指定的ID字段。

答案 2 :(得分:1)

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

如果您想检查该值是否存在,则由您决定。虽然始终通过唯一的ID错误使其不是检查表中是否已存在该值的正确方法。保存错误处理以查找真实错误并手动进行检查。例外可能会受到很小的性能影响,应该保留用于实际的程序异常,而不是常规。

但是,如果由于某种原因,该字符串将在另一列中引用,我将创建一个ID字段。如果字符串长度为32个字符,则每个记录需要32个字节的空间(假设为ASCII)。作为主键的32位int只需要4个字节(32/8 = 4)。因此,如果您在另一个表中引用该字符串,则将使用整数ID来节省空间。

此外,如果对主键使用整数ID,则可能会考虑通过字符串对索引进行聚类(如果您将通过字符串而不是ID进行大量查找)。在这种情况下,按字符串而不是主键进行分组可能会对性能产生很大影响。

答案 3 :(得分:1)

你确定这个字符串是唯一的吗?没有人能够改变它吗?如果是的话就可以了。其他只是使用id