【问题标题】:Simple SQL Data Modeling question简单的 SQL 数据建模问题
【发布时间】:2011-01-25 03:05:47
【问题描述】:

鉴于我有一个包含车辆信息的表格,其中一条信息是 VehicleType(通常为 6-20 个字符),那么设计这样的表格的技术原因是什么:

车辆

车辆ID
VehicleTypeID (INT)(与 VehicleTypes 表中的一个 INT 相关)

与此相反:

车辆

车辆ID
车辆类型 (NVARCHAR(50))

我能想到几个……
1) 如果车辆类型的描述发生变化,只需要在一个记录中更改。
2) 存储 INT 比 NVARCHAR 占用更少的空间(当然,取决于字符串长度,特别是如果我更改为 TINYINT。)

几个问题...
1)任何索引注意事项?我假设如果我要在 VehicleType 上建立索引,如果我使用 INT 而不是 NVARCHAR,它会更快并且占用更少的空间。
2) 任何查询优化问题?我知道前一种方法需要 JOIN,但我不认为这会对 SQL 2008 造成负担。

我将捍卫自己的立场,并希望获得尽可能多的信息。

感谢您抽出宝贵时间回复。

谢谢,
达维斯

【问题讨论】:

    标签: sql sql-server database-design sql-server-2008 data-modeling


    【解决方案1】:

    小心更改“选择列表”(域)中的名称,例如 Vehicle Type

    如果您使用的是 外键,那么该类型的所有现有条目都会受到影响 - 这是否有效?

    我不知道Vehicle Type 是什么意思,但是如果Vehicle Type = VehicleMake 可能会出现问题,例如,Datsun 将其名称更改为 Nissan - 表中的现有车辆仍然是 Datsun.. ...

    【讨论】:

      【解决方案2】:

      基本上,您要做的是对表格设计进行反规范化。当涉及到报告目的(当有数百万条记录时)时,这基本上很有用,但对于应用程序目的,我会使用一个规范化的数据库,并在其上构建适当的索引。这也有助于参照完整性。

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        如果车辆类型的描述发生变化,只需在一条记录中更改。

        正确。还有目前未使用的“车辆类型”,例如燃料电池汽车。

        这些是“data modification anomalies

        其他人已经回答了索引问题...

        【讨论】:

          【解决方案4】:

          前者是3NF,正确归一化的数据。

          1) 任何索引注意事项?

          不会为外键自动创建索引。在外键上创建索引是有意义的——它很可能被用作标准,但应该考虑数据和对其的访问。 MySQL 对分配索引的空间量有限制(据我所知,没有其他人这样做),虽然索引有助于数据检索,但它们也会影响 INSERT/UPDATE/DELETE 语句。如果与 SQL Server 打交道,我highly recommend reading Kim Tripp's The Tipping Point series

          2) 任何查询优化问题?我知道前一种方法需要 JOIN,但我不认为这会对 SQL 2008 造成负担。

          与子查询相比,连接是最优选的数据检索和操作方式...

          【讨论】:

          • SQL Server 的索引限制为 900 字节,最多 16 列
          • @SQLMenace:谢谢,那么在其他数据库中可能会出现类似的情况。
          【解决方案5】:

          如果您有一个“批准的”车辆类型列表供用户从“VehicleType”表中选择,那么在数据输入表单中也很有用。如果你不这样做,你最终会得到不在列表中的拼写错误和车辆类型。此外,当添加新的车辆类型时,如果您从查询中填充下拉列表,则无需更改数据输入前端,查询只会获取表中的所有车辆类型。

          【讨论】:

            【解决方案6】:

            请记住,nvarchar 每个字符需要 2 个字节,因此如果 int 是 4 个字符,那么要使用相同的空间,您只能在 nvarchar 列中使用 2 个字符。

            如果 tinyint(最多 255)还不够,我会选择 int 甚至 smallint(最多 32,767 和 2 个字节的存储空间)

            所以在这种情况下我会使用第一个表

            不知道您的查询会是什么样子,但可能是切换列并以 typeid 开头的想法

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-07-05
              • 1970-01-01
              • 1970-01-01
              • 2021-12-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-25
              相关资源
              最近更新 更多