Database design 字符串的单列还是两列?

Database design 字符串的单列还是两列?,database-design,Database Design,我正在将单个字符串保存到一个表中,它必须是唯一的。在保存它之前,我将检查它是否已经存在。没有其他字段 我可以只拥有一个以字符串作为主键的单列表,还是应该拥有一个uniques标识符ID列?为什么在这两种情况下?字符串可以更改吗? 字符串的长度是多少(如果其他表将其用作外键,这一点很重要) 通常,如果值可以更改,或者您需要其他表来关联它,我建议使用指定的ID字段。如果您的字符串是唯一的(并且始终是唯一的),则可以将其作为唯一的列和主键 我使用单独ID的唯一原因是 在未来的某个时候,它将变得非独一无

我正在将单个字符串保存到一个表中,它必须是唯一的。在保存它之前,我将检查它是否已经存在。没有其他字段

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

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

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

如果您的字符串是唯一的(并且始终是唯一的),则可以将其作为唯一的列和主键

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

  • 在未来的某个时候,它将变得非独一无二;或
  • 如果它是一个大字符串,并且希望另一个表列引用它(外键)
  • 我会将这一原则应用于这两种情况,并在它发生时担心它

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


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

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

    如果要检查该值是否存在,则由您决定。尽管始终通过唯一ID错误检查该值是否已存在于表中,但这并不是一种正确的方法。保存实际错误的错误处理,并手动执行检查。异常可能会对性能造成很小的影响,应该针对真正的程序异常而保留,而不是常规的异常

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


    此外,如果您使用一个整数ID作为主键,您可能会按照字符串对索引进行聚类(如果您将按照字符串而不是ID进行大量查找)。在这种情况下,按字符串而不是主键分组可能对性能有很大影响。

    您确定此字符串是唯一的吗?没有人能改变它?如果可以的话。其他方法只是使用id

    +1来依赖唯一约束,而不是编码手动检查。