哪个更好的性能和(方法):存储为行或 varchar 列

Sha*_*Daj 1 database-design

选项A:

表A:

  • TableA_ID (PK,int)
  • ..

表B:

  • TableB_ID (PK,int)
  • ..

表C:

  • TableC_ID (PK,int)
  • ..

表D:

  • TableA_ID (FK, int)
  • TableB_ID (FK, int)
  • TableC_ID (FK, int) (可空)

组合键 (TableA_ID,TableB_ID,TableC_ID)

我正在考虑将 TableD 设计如下(OptionB)

表D:

  • TableA_ID (FK, int)
  • TableB_ID (FK, int)
  • TableC_ID (varchar(max) ) (Nullable) 并删除组合键。因此,TableC_ID 列将具有以下内容:{1,2,3,4,....}

我的应用程序将需要使用 TableD 作为搜索 TableB_ID 和/或 TableC_ID 列中的值,方法是提供 TableA_ID 中的值的键。

我只是想知道哪个选项会更好的性能。

Aas*_*lah 7

选项 B 是最糟糕的选择:为什么 因为将 CSV 格式的值保存在单个列中,您首先违反了 NF http://en.wikipedia.org/wiki/First_normal_form

违反第一个 NF 的最关键缺点是复杂的连接条件。您必须使用 LIKE 运算符和最差的通配符选项或使用其他字符串函数来应用连接。

其次,RDBMS 将无法创建正确的数据分布统计信息,最终查询优化器无法选择高效的执行计划。