sql - 通常,字符串(或varchar)字段用作连接字段吗?

标签 sql string database-design types data-modeling

我们有两张 table 。第一个包含名称 (varchar) 字段。第二个包含引用第一个表中的名称字段的字段。第二个表中的外键将针对与该名称关联的每一行重复。通常不鼓励使用 varchar/string 字段作为两个表之间的连接吗?什么时候可以将字符串字段用作连接字段的最佳情况?

最佳答案

当然可以使用 varchar 作为键字段(或只是加入的东西)。它的主要问题是基于您通常存储在 varchar 字段中的内容;可变数据。严格来说,不建议更改关键字段。一个人的姓名、电话号码,甚至他们的 SSN 都可以更改。但是,内部 ID 为 3 的员工将始终为 ID 3,即使有两个 John Smiths。

其次,字符串比较取决于许多挑剔的细节,例如文化、排序规则、空格转换等,这些细节可能会无缘无故地破坏连接。假设您对要加入的特定字符串使用制表符\t。稍后,您更改软件以将\t 替换为 3 个空格,以减少原始字符串中的字符转义。您现在已经破坏了任何需要将带有转义制表符的字符串与外观相同但组成不同的字符串相匹配的功能。

最后,即使给定两个完全相同的字符串,比较两个整数也比比较两个字符串有轻微的性能优势。整数比较实际上是恒定时间的。根据字符串的长度,字符串比较最多是线性的。

关于sql - 通常,字符串(或varchar)字段用作连接字段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3916609/

相关文章:

Python:如何替换由某些字符包围的字符串

sql - 将一个表映射到许多其他表?

sql - 复制同一表中的一行而无需键入 50 多个列名(同时更改 2 列)

php - 我是否足以保护我的网站免受 sql 注入(inject)?

mysql - 在 mysql 中有更好的方法吗? - 用另一个选择和分组更新整个列

mysql - 安装 Mongify 时出错

c - 从 C 中的文本文件中获取每个字符串的第一个字符

c++ - 如何从 LPCTSTR 转换为 std::string?

n * (n - 1)/2 算法的 MySQL 架构

algorithm - 存储同义词的数据结构