主键和外键的作用

Jun 07, 2016 pm 03:22 PM
主キー 効果 外部キー 複数

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。 必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

主键:

关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:

1. 惟一地标识一行。

2. 作为一个可以被外键有效引用的对象。

基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

2. 主键应该是单列的,以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

数据库外键的使用

外键的作用我认为主要有两个:一个是让数据库自己通过外键来保证数据的完整性和一致性,一个就是能够增加ER图的可读性。我觉得第二点的重要性甚至比第一点还高。

有些人认为外键的建立会给开发时操作数据库带来很大的麻烦,因为数据库有时候会由于没有通过外键的检测而使得开发人员删除,插入操作失败,他们觉得这样很麻烦,其实这正式外键在强制你保证数据的完整性和一致性,这是好事儿。

应该说如果系统比较小,外键的作用可能不会很明显,如果你的系统后台有几百个表的话,没有外键的数据库设计是我无法想象的,有一个基础数据的表:商品,其他表都保存商品ID ,查询时需要连表来查询商品的名称,单据1的商品表中有商品ID字段,单据2的商品表中也有商品ID字段,如果不拉出外键的话,当单据1,2都使用商品ID为3的商品后,删除此商品后,再查看单据1,2的时候就会查不到商品的名称

当表很少的时候,有人认为可以在程序实现的时候来通过写脚本来保证数据的完整性和一致性,也就是在删除商品的操作的时候去检测单据1,2中是否已经使用了商品ID为3的商品,但是当你写完脚本之后系统有增加了一个单据3
他也保存商品ID找个字段,如果不拉出外键,你还是会出现查不到商品名称的情况,你总不能每增加一个使用商品ID的字段的单据时就回去修改你检测商品是否被使用的脚本吧

第二点就是增加ER图的可读性。这也同样是在后台数据库表非常多的时候能够体现出来的,外键能够明确的两个表之间的关系,例如一个单据的主表和单据的品的子表,如果两个表没有拉出外键表明关系,且两个表的位置在ER图中很远,对于一个对这个系统不是非常了解的人来说,让他去理出两个表之间的关系是很麻烦的,如果你拉出外键就算两个表离的很远,他也能随着外键找出他们之间的关系来,ER图的可读性对于一个刚刚接触大型系统的新手来说是极为重要的。

当然,外键的个数也不是没有个尺度,因为外键拉的过多会使ER图极为混乱(到处都是线) ,所以应该掌握合适的尺度才行,必要的外键必须要拉出来。如果实在不想因为外键过多而造成ER图的混乱,可以对基础数据的删除用假删除的办法,以避免在没有外键约束和检查的情况下造成数据的不一致性。

uniqueidentifier数据类型

uniqueidentifier数据类型可存储16字节的二进制值,其作用与全局唯一标记符(GUID)一样。GUID是唯一的二进制数:世界上的任何两台计算机都不会生成重复的GUID值。GUID主要用于在用于多个节点,多台计算机的网络中,分配必须具有唯一性的标识符。 在SQL中 ROWGUIDCOL表示新列是行的全局唯一标识列。对于每个表只能指派一个uniqueidentifier 列作为ROWGUIDCO列。ROWGUIDCOL属性只能指派给uniqueidentifier列
一 什么是uniqueidentifier?
Uniqqueidentifier 是全局唯一的标识

p d [3~)F F C E0二 UniqueIdentifier 数据类型的列如何赋值?
1 使用 NewID()函数 来实现
2 直接将字符串的常量转化成这样的格式 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
举例:6F9619FF-8B86-D011-B42D-00C04FC964FF 为有效的UniqueIdentifier数据
3 直接赋于32位的十六位数据
举例 0xffffffff00000000ffffffff00000000
三 UniqueIdentifier 数据类型 数据实际是怎么在数据库中保存的?
UniqueIdentifier 数据类型存储实际的数据是16个字节的二进制值,
UniQueIdentifier 可以转化成实际的字符串型和二进制数据类型

四 NewID()函数是如何生成唯一的UniqueIdentifier 值的呢?
NewID()函数是从他们的网卡上的标识数字和CPU时钟的唯一的数字生成新的UniqueIdentifier数据 ,这个数据和GUID是一样的每台计算机能生成全球唯一的值
这样在多台计算机和多网络之间生成具有唯一性的标识符

五 使用 Uniqueidentifier数据类型的主要的优点
Uniqueidentifier 数据类型主要的优点是在使用newid函数生成值的时候是可以保证值的全球唯一性
可以唯一的标识单行的记录 对于多库(尤其是多机器,多网段的数据库的复制)来将比IDEntity来的更有效
其次在使用Identity的情况下,我们对自动生成的值是不能修改的,而Uniqueidentifier数据类型是可以随时修改的

六 使用Uniqueidentifier的数据类型的缺点
1 对于生成的Uniqueidentifier 类型的值来讲 ,是无序
在正常显示相关的数据信息的时候,返回的信息是无序的ITPUB个人空间 p e%A _0`2I l(G!v t0]
对于 Identity 为标识的数据显示的时候,默认的情况下是根据添加记录的顺序来显示的。这样,对于uniqueidentifier为主键的信息集 ,还是需要一个默认标识排序的字段。

2 对于Uniqueidentifier 字段来将数据的实际的信息为16个字节,相对来将比Identity来讲 大的多,相对来将 存储空间和查询的效率会降低很多的。

七 在系统数据库的设计中我们如何对Uniqueidentifier,Identity ,和可标识的记录属性(有实际的含义的信息)作为主键 ,这三种方式 进行取舍

以属性为主键的系统设计情况
在系统设计的过程中
单条信息中包含可以表示唯一性的属性(一般不能太多3个以内)而且这样的属性是必填字段。在记录生存周期内一般是不进行改动的,表一般多于50个这样级别的系统
以属性为主键 ,这样的方式还是最佳的

举例: 关于学生的管理信息系统 以学生的学号为主键

以Uniqueidentifier 列为主键的情况
在需要多个数据库之间,多个网段之间需要进行数据库的复制时,我们就需要在每一个唯一的标识来区别每一个单条记录,在没有合适的属性来做主键的情况下可以用Uniqueidentifier列来生成主键

以 Identity为主键的情况
不需要数据库的复制,和系统比较小的情况下(50表以内)可以用 Identity列来生成主键,适合于快速开发

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

win11のタッチキーボードの機能と使い方 win11のタッチキーボードの機能と使い方 Jan 03, 2024 pm 04:40 PM

win11 の設定を参照すると、タッチ キーボードの設定があることがわかりますが、画面はタッチ スクリーンをサポートしていないため、この win11 のタッチ キーボードは何に使用されますか?実際、これはオンスクリーン キーボードです。 win11 タッチ キーボードの機能: 1. win11 タッチ キーボードは実際には「オンスクリーン キーボード」です。 2. 実際のキーボードをシミュレートし、クリックすることでキーボードを使用できます。 3. キーボードがない場合、またはキーボードが壊れている場合は、キーボードを使用して入力できます。 4. Win11 には、タッチ キーボード用のカスタマイズされたオプションが豊富に用意されています。 5. さまざまな色とテーマが含まれており、ユーザーは好みのスタイルを自由に切り替えることができます。 6. 左上隅の「歯車」をクリックして、キーボードのレイアウト、手書き入力、その他の入力方法を変更します。

nohupの機能と原理の解析 nohupの機能と原理の解析 Mar 25, 2024 pm 03:24 PM

nohup の役割と原理の分析 Unix および Unix 系オペレーティング システムでは、nohup はバックグラウンドでコマンドを実行するためによく使用されるコマンドです。ユーザーが現在のセッションを終了したり、ターミナル ウィンドウを閉じたりしても、コマンドはまだ実行され続けています。この記事では、nohup コマンドの機能と原理を詳しく分析します。 1. nohup の役割: バックグラウンドでのコマンドの実行: nohup コマンドを使用すると、ターミナル セッションを終了するユーザーの影響を受けることなく、長時間実行されるコマンドをバックグラウンドで実行し続けることができます。これは実行する必要があります

Bluetooth アダプターは何に使用されますか? Bluetooth アダプターは何に使用されますか? Feb 19, 2024 pm 05:22 PM

Bluetooth アダプターは何をしますか? 科学技術の継続的な発展に伴い、無線通信技術も急速に開発され、普及してきました。中でもBluetooth技術は、近距離無線通信技術として、さまざまな機器間のデータ伝送や接続に広く利用されています。 Bluetooth アダプターは Bluetooth 通信をサポートする重要なデバイスとして重要な役割を果たします。 Bluetooth アダプターは、Bluetooth 非対応デバイスを Bluetooth 通信をサポートするデバイスに変えることができるデバイスです。無線信号をBluetooth信号に変換することで、機器間の無線接続やデータ通信を実現します。 Bluetoothアダプター

Linux DTS の役割と使用法を理解する Linux DTS の役割と使用法を理解する Mar 01, 2024 am 10:42 AM

LinuxDTS の役割と使用法を理解する 組み込み Linux システムの開発において、デバイス ツリー (DeviceTree、略して DTS) は、システム内のハードウェア デバイスとその接続関係と属性を記述するデータ構造です。デバイス ツリーを使用すると、カーネルを変更せずに、Linux カーネルをさまざまなハードウェア プラットフォーム上で柔軟に実行できます。この記事では、LinuxDTS の機能と使用法を紹介し、読者の理解を深めるために具体的なコード例を示します。 1. デバイスツリーの役割 デバイスツリー

PHP における定義関数の重要性と役割を探る PHP における定義関数の重要性と役割を探る Mar 19, 2024 pm 12:12 PM

PHPにおけるdefine関数の重要性と役割 1.define関数の基本紹介 PHPにおいて、define関数は定数を定義するための重要な関数であり、定数はプログラムの実行中に値が変化しません。定義関数を使用して定義された定数は、スクリプト全体からアクセスでき、グローバルです。 2. 定義関数の構文 定義関数の基本的な構文は次のとおりです。

Gunicorn の基本と機能について詳しく知る Gunicorn の基本と機能について詳しく知る Jan 03, 2024 am 08:41 AM

Gunicorn の基本概念と機能 Gunicorn は、Python Web アプリケーションで WSGI サーバーを実行するためのツールです。 WSGI (Web Server Gateway Interface) は Python 言語で定義された仕様で、Web サーバーと Web アプリケーション間の通信インターフェイスを定義するために使用されます。 Gunicorn では、WSGI 仕様を実装することで、Python Web アプリケーションを運用環境にデプロイして実行できるようになります。ガニコーンの機能は次のとおりです。

Redmi K70Proでリターンキーとホームキーを設定するにはどうすればよいですか? Redmi K70Proでリターンキーとホームキーを設定するにはどうすればよいですか? Feb 23, 2024 pm 01:40 PM

今や携帯電話は若者から中高年までの必需品となっていますが、当然のことながら、各世代ごとに携帯電話に対するニーズは異なります。現在最も人気のあるモデルの 1 つである RedmiK70Pro は、さまざまな年齢の消費者のニーズを満たすことができる非常に多様な機能とサービスを備えています。 Redmi K70Proでリターンキーとホームキーを設定するにはどうすればよいですか?また、それを明確に理解する必要があります。それを理解した後でのみ、この携帯電話を購入するかどうかを決定できます。その後、編集者に従って次のコンテンツを見てください。 Redmi K70Proでリターンキーとホームキーを設定するにはどうすればよいですか?携帯電話の設定メニューにアクセスするには、通知シェードをプルダウンするか、ホーム画面で設定アイコンを探して設定インターフェイスを開きます。設定インターフェイスで、「ボタン」または「ナビゲーション バー」を見つけてクリックします。

PHP は何に使われますか? PHP の役割と機能を調べる PHP は何に使われますか? PHP の役割と機能を調べる Mar 24, 2024 am 11:39 AM

PHP は、Web 開発で広く使用されているサーバー側スクリプト言語です。その主な機能は、動的な Web コンテンツを生成することです。HTML と組み合わせると、リッチでカラフルな Web ページを作成できます。 PHP は強力で、さまざまなデータベース操作、ファイル操作、フォーム処理、その他のタスクを実行でき、Web サイトに強力な対話性と機能を提供します。次の記事では、詳細なコード例を使用して、PHP の役割と機能をさらに詳しく説明します。まず、PHP の一般的な使用法である動的な Web ページの生成を見てみましょう: P

See all articles