物理数据库设计 - 限定列的有效值

一、说明问题

  其实这篇非常简单,因为大家都是用这个方法解决的,我决定用自己的语言来描述清楚这一个问题。

  假设,我们有一个列,这个列只能够取某些有效值。比如一个用户表,我们有一个姓氏列,我们需要限定里面的值为中国的姓氏,比如:赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨。

二、反模式

  对于这个问题,其实只有初学者可能会用这个方法,就是使用CHECK约束或者触发器来限定列的值,比如:

  CHECK (lastname IN (‘赵‘,‘钱‘,‘孙‘,‘李‘)); 

  这样做的缺点如下:

  1、获取所有可选值有困难,假设我要做个下拉列表,让用户选择可供输入的姓氏,那么SQL语句就复杂了,你需要查询系统视图。

  2、添加可选值,假如我们要增加一个外国的姓氏。那么你需要修改CHECK约束或触发器。

  3、删除可选值,假设从今天起又不支持外国姓氏了,但是数据库中又已经有了一个外国姓氏,你不得不保留这一个废弃值。但下拉列表框中又不能再让用户选,这下麻烦大了。

  4、移植性差,CHECK,约束,触发器的语法在各种数据库不相同,移植难度大。

三、解决方案

  创建一张检查表,每一行包含允许姓氏出现的值,然后定义一个外键约束。

  这个你懂的,不再废话。

  除非,你很确定这些值不会变时,你可以使用CHECK约束或触发器等手段实现。例如性别:男,女。否则,还是使用检查表的方式比较好。

时间: 2024-08-30 04:55:17

物理数据库设计 - 限定列的有效值的相关文章

SQL反模式学习笔记11 限定列的有效值

2014-10-14 08:46:07 目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值:            create table Bugs(status varchar(20) check(status in('new','in progress','fixed'))). 2.使用域或者用户自定义类型(UDT)等方法.        

逻辑数据库设计 - 多列属性(多列转行)

假设有一个要开发一个试题系统,全是不定项选择题.一道题可能有2,3,4...个答案,数据应如何设计呢?本处旨在说明问题所在,例如同类问题还有存储电话,一个人可能有多个号码等等. 一.存储多值属性 反模式:创建多个列. 我们知道每列最好只存储一个值,因此先看如下设计: CREATE TABLE Question( QuestionId int PK, QuestionBody nvarchar(500), Answer1 nvarchar(500), Answer2 nvarchar(500),

物理数据库设计 - 理解浮点数

一.浮点类型简介 整型是一个很有用的数据类型,但只能存储整数,比如1.199.-19.但不能表述像2.5这样的浮点数.如果数据对精度要求很高,你需要使用另一种数据类型来取代整型.比如算钱的时候通常需要精确到小数点后两位,像$19.95. 在这里首先来介绍下SQLServer中的浮点数: 浮点类型 是否精确 说明 decimal 精确数值型 -1038次方+1~1038-1的固定精度和范围的数值型数据 numeric 精确数值型 同decimal float 近似数值型 -1.79E+308~1.

物理数据库设计 - 文件是否应该存储在数据库中

多媒体文件已经广泛应用在很多程序当中.比如用户的头像,汽车的产品图片等等. 从我个人以往的经验来看,将文件的路径存储入数据库,然后文件本身存储于硬盘当中已是万年不变的解决方案. 其实,存储图片路径与存储图片文件本身,两种方案都有很好的立足点,但是大部分程序员都是将文件存储于数据库之外.虽然,这种方法没有什么大问题,但的确是存在一定的风险的. 一.问题描述 下面就来论述一下关于将文件存储于数据库外部的缺点. 1.垃圾回收问题. 当你想删除一张图片时,你只能够删除掉数据库中的记录,图片文件是没有办法

DBA词典:数据库设计常用词汇中英文对照表

1. Access method(访问方法):此步骤包括从文件中存储和检索记录. 2. Alias(别名):某属性的另一个名字.在SQL中,可以用别名替换表名. 3. Alternate keys(备用键,ER/关系模型):在实体/表中没有被选为主健的候选键. 4. Anomalies(异常)参见更新异常(update anomalies) 5. Application design(应用程序设计):数据库应用程序生命周期的一个阶段,包括设计用户界面以及使用和处理数据库的应用程序. 6. Att

SQL SERVER学习2——数据库设计

数据库设计是数据库知识中比较重要的部分,我们需要了解数据库设计的基本步骤,E-R图的画法. 数据库设计的基本概述 检验一个数据库设计好坏的标准就是,看他是否能够方便的执行各种数据检索和处理操作,并且有利于数据的控制管理和维护. 数据库设计步骤 设计数据库规范中比较著名的是"新奥尔良方法"(这个可不是做新奥尔良鸡腿的方法哦),Now Orleans,总计4个阶段: 需求分析(分析用户要求,制作数据流图和判定图) 概念结构设计(信息分析和定义,制作E-R图) 逻辑结构设计(设计实现,关系型

数据库物理分布设计(转)

概述我们无论使用哪种数据库,无论怎样设计数据库,我想都会遵从一个原则:数据安全性和性能高效这两个主要方面,但是关于这两个方面的话题太多,在这里就不一 一陈述,我只是从数据库物理分布设计方面和大家一起简单的探讨一下.因为数据库良好的物理分布设计也是对数据安全性和性能高效影响比较大, 就象我们在建大楼之前一定要先打好地基一样.現实中我们在应用各种不同数据库的时候,往往会忽略数据库的物理布局,只有在数据库性能遇到问题的时候才去考虑,但这是得不偿失的,这样一来不仅会导致与 设计相关的问题出现,而且会影响

优化MySchool数据库设计之【巅峰对决】

优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识点时,要进行验证 02.查看帮助文档和搜索引擎的使用 借助网络上的Blog文章 03.不要急功近利 不要抱着速成的想法,否则必然走弯路学习编程不是一蹴而就的事情付出的成本高,才能有一个高薪的收入 04.不要浮躁 不要什么都学,只学有用的 浮躁的程度和技术水平成反比的走自己的路,让别人去浮躁去吧! 每

ACCP7.0优化MYSCHOOL数据库设计内测笔试题总结

) 在SQL Server 中,为数据库表建立索引能够(C ). 索引:是SQL SERVER编排数据的内部方法,是检索表中数据的直接通道 建立索引的作用:大大提高了数据库的检索速度,改善数据库性能 A. 防止非法的删除操作 B. 防止非法的插入操作 C. 提高查询性能 D. 节约数据库的磁盘空间 2) 在SQL SERVER中,创建一个表使用(C  )语句. A. INSERT   增加数据 B. DROP      删除数据库,表,约束,视图,索引,存储过程 C. CREATE   创建数据