讨论SQL Server 表的主键问题
关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。 主键设计现状和问题 关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形
关于数据库的逻辑设计,是一个很广泛的问题。本文主要针对开发应用中遇到在MS SQL Server上进行表设计时,对表的主键设计应注意的问题以及相应的解决办法。
主键设计现状和问题
关于数据库表的主键设计,一般而言,是根据业务需求情况,以业务逻辑为基础,形成主键。
比如,销售时要记录销售情况,一般需要两个表,一个是销售单的概要描述,记录诸如销售单号、总金额一类的情况,另外一个表记录每种商品的数量和金额。对于第一个表(主表),通常我们以单据号为主键;对于商品销售的明细表(从表),我们就需要将主表的单据号也放入到商品的明细表中,使其关联起来形成主从关系。同时该单据号与商品的编码一起,形成明细表的联合主键。这只是一般情况,我们稍微将这个问题延伸一下:假如在明细中,我们每种商品又可能以不同的价格方式销售。有部分按折扣价格销售,有部分按正常价格销售。要记录这些情况,那么我们就需要第三个表。而这第三个表的主键就需要第一个表的单据号以及第二个表的商品号再加上自身需要的信息一起构成联合主键;又或者其他情况,在第一个主表中,本身就是以联合方式构成联合主键,那么也需要在从表中将主表的多个字段添加进来联合在一起形成自己的主键。
数据冗余存储:随着这种主从关系的延伸,数据库中需要重复存储的数据将变得越来越庞大。或者当主表本身就是联合主键时,就必须在从表中将所有的字段重新存储一次。
SQL复杂度增加:当存在多个字段的联合主键时,我们需要将主表的多个字段与子表的多个字段关联以获取满足某些条件的所有详细情况记录。
程序复杂度增加:可能需要传递多个参数。
效率降低:数据库系统需要判断更多的条件,SQL语句长度增加。同时,联合主键自动生成联合索引
WEB分页困难:由于是联合主键方式(对于多数的子表),那么在WEB页面上要进行分页处理时,在自关联时,难于处理。
解决方案
从上面,我们已经看到现有结构存在着相当多的弊端,主要是导致程序复杂、效率降低并且不利于分页。
为解决上述问题,本文提出:当应用系统后台数据库表间存在主从关系时,数据库表额外增加一非业务字段作为主键,该字段为数值型;或者当该表需要在应用中进行分页查询时,也应考虑如此设计。一般地,我们也可以几乎为任何表增加一个与业务逻辑无关的字段作为该表的主键字段。
由于该字段要作为表的主键,那么其首要条件是要保证在该表中要具有唯一性。同时,结合SQL Server数据库自身的特性,可以为其建立一个自增列:
以下为引用的内容:
create TABLE T_PK_DEMO
(
U_ID BIGINT NOT NULL IDENTITY(1,1),
--唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,
--其他列
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED
(U_ID)--定义为主键
)
但是,SQL Server中的自增列却存在一个比较尴尬的事实,那就是该字段一旦定义和使用,用户无法直接干预该字段的值,完全由数据库系统自身控制:
完全数据库系统控制,用户无法修改值
在数据库的发布和订阅时,使用自增列会比较麻烦
恢复部分数据时,使用自增列会比较麻烦
该列的值必须在插入数据后才能获取
鉴于此,建议不以自增列的方式来定义,而是参考Oracle数据库系统中序列,在SQL Server系统中实现类似Oracle数据库系统序列功能。这个具体在下面的小节中介绍。我们只需要按照普通字段的定义方式修改表定义为:
以下为引用的内容:
create TABLE T_PK_DEMO
(
U_ID BIGINT NOT NULL ,--唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,--其他列
CONSTRAINT PK_T_PK_DEMO PRIMARY KEY NONCLUSTERED (U_ID)--定义为主键
)
参照Oracle序列的功能,我们需要在SQL Server数据库中创建一个新表,以管理序列值:
以下为引用的内容:
create TABLE T_DB_SEQ
(
SEQ_NAMEVARchar(50) NOT NULL ,--序列名称
SEQ_OWNER VARchar(50) NOT NULL DEFAULT ’DBO’,
--序列所有者(SYSTEM_USER)
SEQ_CURRENT BIGINT NOT NULL DEFAULT 0,--序列当前值
SEQ_MIN BIGINT NOT NULL DEFAULT 0,--序列最小值
SEQ_MAX BIGINT NOT NULL DEFAULT 0,--序列最小值
SEQ_MAX BIGINT NOT NULL DEFAULT 0,--序列最大值
SEQ_STEPINT NOT NULL DEFAULT 1,--序列增长步长
IF_CYCLEINT NOT NULL DEFAULT 0,--是否循环(0,不循环;1,循环)
CONSTRAINT T_DB_SEQ PRIMARY KEY CLUSTERED
(SEQ_NAME,SEQ_OWNER)--主键
)
应用系统为需要创建自增列的表创建一个序列名称,在表“T_DB_SEQ”中反映为数据库中的一行。
第一,需要为需要建立序列的表创建一个序列。采用方法:F_create_SEQ(序列名)。该函数传入序列的名称,在表“T_DB_SEQ”插入一行。序列的所有者,采用系统变量SYSTEM_USER。
第二,获取下一个值。采用方法:F_GET_NEXT_SEQ_VAL(序列名)。该函数根据序列名获取该序列的下一个值,根据当前值与增长步长得到。同时,该函数保证在同时获取同一个序列时,应保证并发一致性。
第三、将返回值返回到应用使用。
此外,为保证应用的完整性,可能还需要提供一些方法的重载方法,同时提供一些其他方法:
获取序列当前值:F_GET_SEQ_CUR_VAL(序列名)
设置序列值:F_SET_SEQ_VAL(序列名)
删除序列:F_DEL_SEQ(序列名)
判断序列是否存在:F_SEQ_exists(序列名)
在主从关系的表设计中,子表也使用序列字段作为唯一主键,将父表的序列字段作为外键关联:
以下为引用的内容:
create TABLE T_PK_DEMO_C
(
U_ID BIGINT NOT NULL ,--唯一标识记录的ID
COL_OTHER VARchar(20) NOT NULL ,--其他列
P_ID INT NOT NULL ,--父表ID
CONSTRAINT PK_T_PK_DEMO_C PRIMARY KEY
NONCLUSTERED (U_ID)--定义为主键
CONSTRAINT FK_T_PK_DEMO_C FOREIGN KEY (P_ID)
REFERENCES T_PK_DEMO(U_ID) ON delete CASCADE,
)
使用序列的问题及解决办法

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



WindowsServerBackup ist eine Funktion des WindowsServer-Betriebssystems, die Benutzern dabei helfen soll, wichtige Daten und Systemkonfigurationen zu schützen und vollständige Sicherungs- und Wiederherstellungslösungen für kleine, mittlere und große Unternehmen bereitzustellen. Nur Benutzer, die Server2022 und höher ausführen, können diese Funktion nutzen. In diesem Artikel erklären wir, wie Sie WindowsServerBackup installieren, deinstallieren oder zurücksetzen. So setzen Sie die Windows Server-Sicherung zurück: Wenn Sie Probleme mit der Sicherung Ihres Servers haben, die Sicherung zu lange dauert oder Sie nicht auf gespeicherte Dateien zugreifen können, können Sie die Sicherungseinstellungen Ihres Windows Servers zurücksetzen. Um Windows zurückzusetzen

Das Problem der Clustering-Effektbewertung im Clustering-Algorithmus erfordert spezifische Codebeispiele. Clustering ist eine unbeaufsichtigte Lernmethode, die ähnliche Stichproben durch Clustering von Daten in eine Kategorie gruppiert. Bei Clustering-Algorithmen ist die Bewertung des Clustering-Effekts ein wichtiges Thema. In diesem Artikel werden mehrere häufig verwendete Indikatoren zur Bewertung des Clustering-Effekts vorgestellt und entsprechende Codebeispiele gegeben. 1. Clustering-Effekt-Bewertungsindex Silhouette-Koeffizient Der Silhouette-Koeffizient bewertet den Clustering-Effekt, indem er die Nähe der Stichprobe und den Grad der Trennung von anderen Clustern berechnet.

Mobiltelefone sind heute für junge und mittlere Menschen ein Muss. Natürlich haben Menschen jeder Altersgruppe unterschiedliche Bedürfnisse an Mobiltelefone. Als eines der derzeit beliebtesten Modelle verfügt das RedmiK70Pro über eine Vielzahl interner Funktionen und Dienste, die den Bedürfnissen von Verbrauchern unterschiedlichen Alters gerecht werden können. Wie stelle ich die Return-Taste und die Home-Taste auf dem Redmi K70Pro ein? Sie müssen es auch klar verstehen. Erst wenn Sie es verstanden haben, können Sie entscheiden, ob Sie dieses Mobiltelefon kaufen möchten. Folgen Sie dann dem Herausgeber, um einen Blick auf den folgenden Inhalt zu werfen. Wie stelle ich die Return-Taste und die Home-Taste auf dem Redmi K70Pro ein? Um auf das Einstellungsmenü Ihres Telefons zuzugreifen, können Sie die Einstellungsoberfläche öffnen, indem Sie die Benachrichtigungsleiste nach unten ziehen oder auf Ihrem Startbildschirm nach dem Einstellungssymbol suchen. Suchen Sie in der Einstellungsoberfläche nach „Schaltfläche“ oder „Navigationsleiste“ und klicken Sie darauf.

Um das Problem zu lösen, dass jQuery.val() nicht verwendet werden kann, sind spezifische Codebeispiele erforderlich. Für Front-End-Entwickler ist die Verwendung von jQuery eine der häufigsten Operationen. Unter diesen ist die Verwendung der .val()-Methode zum Abrufen oder Festlegen des Werts eines Formularelements eine sehr häufige Operation. In bestimmten Fällen kann jedoch das Problem auftreten, dass die Methode .val() nicht verwendet werden kann. In diesem Artikel werden einige gängige Situationen und Lösungen vorgestellt und spezifische Codebeispiele bereitgestellt. Problembeschreibung: Wenn Sie jQuery zum Entwickeln von Front-End-Seiten verwenden, treten manchmal Probleme auf

Das iPhone ist für seine leistungsstarke Leistung und seine vielseitigen Funktionen bekannt und ist nicht immun gegen gelegentliche Probleme oder technische Schwierigkeiten, ein häufiges Merkmal komplexer elektronischer Geräte. iPhone-Probleme können frustrierend sein, aber normalerweise ist kein Alarm erforderlich. In diesem umfassenden Leitfaden möchten wir einige der am häufigsten auftretenden Herausforderungen im Zusammenhang mit der iPhone-Nutzung entmystifizieren. Unser Schritt-für-Schritt-Ansatz soll Ihnen bei der Lösung dieser häufigen Probleme helfen und praktische Lösungen und Tipps zur Fehlerbehebung bieten, damit Ihre Geräte wieder einwandfrei funktionieren. Unabhängig davon, ob Sie mit einer Störung oder einem komplexeren Problem konfrontiert sind, kann Ihnen dieser Artikel dabei helfen, diese effektiv zu beheben. Allgemeine Tipps zur Fehlerbehebung Bevor wir uns mit den spezifischen Schritten zur Fehlerbehebung befassen, finden Sie hier einige hilfreiche Tipps

Anlässlich der Veröffentlichung der Build 26040-Version von Windows Server gab Microsoft den offiziellen Namen des Produkts bekannt: Windows Server 2025. Außerdem wurde die Windows11WindowsInsiderCanaryChannel-Version build26040 eingeführt. Einige Freunde erinnern sich vielleicht noch daran, dass vor vielen Jahren jemand Windows NT erfolgreich vom Workstation-Modus in den Server-Modus umgestellt hat und dabei die Gemeinsamkeiten verschiedener Versionen von Microsoft-Betriebssystemen aufgezeigt hat. Zwar gibt es deutliche Unterschiede zwischen Microsofts aktueller Version des Server-Betriebssystems und Windows 11, doch wer auf die Details achtet, dürfte neugierig sein: Warum Windows Server die Marke aktualisiert hat,

Die Generalisierungsfähigkeit von Modellen für maschinelles Lernen erfordert spezifische Codebeispiele. Da die Entwicklung und Anwendung von maschinellem Lernen immer weiter verbreitet wird, wird der Generalisierungsfähigkeit von Modellen für maschinelles Lernen immer mehr Aufmerksamkeit geschenkt. Die Generalisierungsfähigkeit bezieht sich auf die Vorhersagefähigkeit eines maschinellen Lernmodells anhand unbeschrifteter Daten und kann auch als Anpassungsfähigkeit des Modells in der realen Welt verstanden werden. Ein gutes Modell für maschinelles Lernen sollte über eine hohe Generalisierungsfähigkeit verfügen und in der Lage sein, genaue Vorhersagen für neue Daten zu treffen. In praktischen Anwendungen stoßen wir jedoch häufig auf Modelle, die im Trainingssatz gut funktionieren, im Testsatz oder in der Realität jedoch versagen

Das Problem der Etikettenerfassung beim schwach überwachten Lernen erfordert spezifische Codebeispiele. Einführung: Schwach überwachtes Lernen ist eine Methode des maschinellen Lernens, die schwache Etiketten für das Training verwendet. Im Gegensatz zum herkömmlichen überwachten Lernen müssen beim schwach überwachten Lernen nur weniger Beschriftungen zum Trainieren des Modells verwendet werden, und nicht jede Probe muss über eine genaue Beschriftung verfügen. Beim schwach überwachten Lernen ist jedoch die Frage, wie aus schwachen Labels nützliche Informationen genau gewonnen werden können, ein zentrales Thema. In diesem Artikel wird das Problem der Etikettenerfassung beim schwach überwachten Lernen vorgestellt und spezifische Codebeispiele gegeben. Einführung in das Label-Akquisitionsproblem beim schwach überwachten Lernen:
