代码之家  ›  专栏  ›  技术社区  ›  DarLom

简单的SQL数据建模问题

  •  1
  • DarLom  · 技术社区  · 15 年前

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

    车辆

    车辆标识
    vehicletypeid(int)(与vehicletypes表中的int相关)

    与此相反:

    车辆

    车辆标识
    车辆类型(nvarchar(50))

    我能想到一些……
    1)如果车型描述发生变化,只需在一个记录中进行更改。
    2)存储int的空间比nvarchar要小(当然,这取决于字符串的长度,尤其是如果我改为tinyint)。

    几个问题…
    1)是否考虑索引?我假设如果我要在vehicletype上建立索引,如果我使用的是ints而不是nvarchars,那么索引速度会更快,占用的空间也会更少。
    2)是否有查询优化问题?我知道前面的方法需要一个连接,但我不希望这会对SQL 2008产生影响。

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

    感谢您抽出时间作出回应。

    谢谢,
    达维斯

    6 回复  |  直到 12 年前
        1
  •  1
  •   OMG Ponies    15 年前

    前者是3nF,适当的标准化数据。

    1)是否考虑索引?

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

    2)是否有查询优化问题?我知道前面的方法需要一个连接,但我不希望这会对SQL 2008产生影响。

    联接是数据检索和操作的首选方法,而不是说子查询…

        2
  •  4
  •   Leslie    15 年前

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

        3
  •  1
  •   SQLMenace    15 年前

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

    如果tinyint(最多255个)不够,我将使用int甚至smallint(最多32767和2字节的存储空间)

    所以我会用第一张桌子

    不知道您的查询将是什么样子,但可能是切换列并从typeid开始的想法。

        4
  •  1
  •   gbn    15 年前

    如果车辆类型的描述发生变化,则只需在一个记录中对其进行更改。

    对的。另外,对于目前未使用的“车型”,如燃料电池汽车,又该怎么办呢?

    这些是“ data modification anomalies

    其他人回答了索引问题…

        5
  •  0
  •   Raja    15 年前

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

    希望这有帮助。

        6
  •  0
  •   luchosrock    12 年前

    小心更改“中的名称” 拾取列表 '(域)例如 Vehicle Type .

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

    我不知道什么 车型 但是,如果 Vehicle Type = Vehicle , Make 例如,如果 大唐 将其名称更改为 日产 -表中的现有车辆仍然 达孙斯

    推荐文章