【发布时间】:2016-05-20 00:43:10
【问题描述】:
这就是我的意思。假设我有一个名为 Names 的表,它只是一个唯一的名称列表,
Names
================
name
================
"Charlie"
----------------
"George"
----------------
"Bernie"
----------------
以及引用这些名称的另一个表,
OtherTable
=========================
... | name | ....
=========================
... | "Charlie" | ....
-------------------------
... | "Charlie" | ....
-------------------------
... | "Charlie" | ....
-------------------------
数据库引擎是否将实际名称存储在OtherTable 中?还是通过存储一些对它们的隐藏引用来优化?
如果没有,那意味着我应该在Names 中添加一列
id | Names
==================
1 | name
==================
2 | "Charlie"
------------------
3 | "George"
------------------
4 | "Bernie"
------------------
并像引用它一样
OtherTable
=========================
... | name_id | ....
=========================
... | 1 | ....
-------------------------
... | 1 | ....
-------------------------
... | 1 | ....
-------------------------
但是,Names 表上的附加列作为主键是不必要的,因为 names 是唯一的,可以像主键一样服务器(除了查找效率可能稍低) name 因为字符串比较比整数比较慢)。
这不是 Catch-22 的情况吗?
【问题讨论】:
-
我认为你犯了过早的纳米优化。关系数据库的开发人员在创建索引方面很聪明。您应该使您的架构反映您要解决的问题。这些问题不会对您的应用程序的性能产生影响。问题更可能在于索引缺失或不合适、SQL 编写不当、网络延迟过长等。
标签: sql sql-server tsql database-design