AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 6987
Accepted
Thomas Stringer
Thomas Stringer
Asked: 2011-10-20 18:47:56 +0800 CST2011-10-20 18:47:56 +0800 CST 2011-10-20 18:47:56 +0800 CST

类型字段的 INT 或 CHAR

  • 772

表的最佳设计是什么,Type字段是intor char(1)?换句话说,给定这个模式:

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

VehType成为 aint或 a是否更有效(在性能方面)char(1)?假设您有五种类型的汽车,您应该使用递增值 0 -> 4 还是类型的字符(例如,'v'、's'、'c'、't'、'm')?

如果不止于此,我会使用单独的 Type 表并具有外键关系,但我认为没有必要。

我注意到sys.objects目录视图使用一个字符作为type字段。这有什么原因吗?我只是在这里抓住空气,是我更舒服的吗?

sql-server database-design
  • 2 2 个回答
  • 6366 Views

2 个回答

  • Voted
  1. Best Answer
    gbn
    2011-10-20T20:23:43+08:002011-10-20T20:23:43+08:00

    您通常也会使用 1 字节的 tinyint

    • char(1) 会稍微慢一些,因为比较使用排序规则

    • 困惑:什么是 S:SUV 或轿车或轿车或运动?

    • 当您添加更多类型时,使用字母会限制您。见最后一点。

    • 我见过的每个系统都有不止一个客户端,例如报告。将V、S变为“Van”、“SUV”等的逻辑需要重复。使用查找表意味着它是一个简单的 JOIN

    • 可扩展性:再添加一种类型(“F”表示“ Flying car ”),您可以将一行添加到查找表或更改大量代码和约束。还有你的客户端代码,因为它必须知道 V、S、F 等是什么

    • 维护:逻辑在 3 个地方:数据库约束、数据库代码和客户端代码。通过查找和外键,它可以在一个地方

    使用单个字母的好处……呃,看不到任何

    注意:有一个关于 Enums 的相关 MySQL 问题。建议也在那里使用查找表。

    • 19
  2. Fabricio Araujo
    2011-11-01T09:15:52+08:002011-11-01T09:15:52+08:00

    就像对伟大gbn 的回答的补充一样。

    也许您可以创建类似的东西:

    create table dbo.VehicleType
    (
        VehicleTypeId int not null primary key,
        Name varchar(50) not null,
        Code char(3) null
    ) 
    go 
    
    create table Car
    (
        Name varchar(100) not null,
        Description varchar(100) not null,
        VehTypeId int not null ,
        foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
    )
    go 
    

    因此,在保持关系完整性(使用外键)的同时,您可以随心所欲地使用枚举。通过该code列,您可以随意使用您的字符代码,因此它将记录在数据库中(并且您可以直接从数据库中提取代码信息,而无需对系统集成的应用程序代码进行复杂的转换)。

    • 3

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 在数据仓库中实现多对多关系有哪些方法?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve