我最近了解了规范化,并了解在实现新模式时它的重要性。
如何检查我的数据库是否符合 2NF 或 3NF?
手动审查是一个确定的选择,但我正在寻找一种自动化工具。
我不是在寻找点击式工具,更多的是强调可能的优化以使表格符合 3NF。我猜它可能会使用基于良好样本数据和/或列名语义分析的统计数据。
schema normalization database-design database-recommendation
我正在开发一个 SQL Server 2012 数据库,我有一个关于一对零或一关系的问题。
我有两张桌子,Codes和HelperCodes。一个代码可以有零个或一个辅助代码。这是创建这两个表及其关系的 sql 脚本:
CREATE TABLE [dbo].[Code]
(
[Id] NVARCHAR(20) NOT NULL,
[Level] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[SentToRanger] BIT NOT NULL DEFAULT 0,
[LastChange] NVARCHAR(50) NOT NULL,
[UserName] NVARCHAR(50) NOT NULL,
[Source] NVARCHAR(50) NOT NULL,
[Reason] NVARCHAR(200) NULL,
[HelperCodeId] NVARCHAR(20) NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
(
[Id] ASC
),
CONSTRAINT [FK_Code_LevelConfiguration]
FOREIGN KEY ([Level])
REFERENCES [dbo].[LevelConfiguration] ([Level]),
CONSTRAINT [FK_Code_HelperCode]
FOREIGN KEY ([HelperCodeId])
REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 在 5.0.3 版本之后(允许 VARCHAR 为 65,535 字节并停止截断尾随空格),这两种数据类型之间有什么主要区别吗?
我正在阅读差异列表,只有两个值得注意的是:
对于 BLOB 和 TEXT 列上的索引,您必须指定索引前缀长度。对于 CHAR 和 VARCHAR,前缀长度是可选的。请参阅第 7.5.1 节,“列索引”。
和
BLOB 和 TEXT 列不能有 DEFAULT 值。
那么,由于 TEXT 数据类型的这两个限制,为什么要在 varchar(65535) 上使用它?两者之间是否存在性能影响?
http://en.wikipedia.org/wiki/CAP_theorem
http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
我想是不是非常简单,为什么只有两个的
可以适用于任何给定的分布式数据库系统。这个猜想被证实,但有没有看出为什么一个简单的方法可能是,这可能持有?
我不是在寻找证明,只是一种理解为什么这个定理可能有意义的好方法。理由是什么?
在数据库中定义外键还是在应用程序的代码部分中定义外键更好?
我必须模拟一种情况,我有一个表 Chequing_Account(其中包含预算、iban 编号和帐户的其他详细信息),该表必须与两个不同的表 Person 和 Corporation 相关,这两个表都可以有 0、1 或多个支票帐户。
换句话说我有两个1对多关系,同一张表支票账户
我想听听尊重规范化要求的这个问题的解决方案。我听到的大多数解决方案是:
1) 找到一个 Person 和 Corporation 都属于的公共实体,并在它和 Chequing_Account 表之间创建一个链接表,这在我的情况下是不可能的,即使我想解决一般问题而不是这个特定实例。
2) 创建两个链接表 PersonToChequingAccount 和 CorporationToChequingAccount,它们将两个实体与支票账户相关联。但是我不希望两个人有同一个支票账户,也不希望一个自然人和一个公司共享一个支票账户!看到这张图片

3) 在 Chequing Account 中创建两个指向 Corporation 和 Natural Person 的外键,但是我会因此强制一个人和一个公司可以拥有多个支票账户,但是我必须手动确保每个 ChequingAccount 行不是两个关系都指向公司和自然人,因为支票账户要么属于公司,要么属于自然人。看到这张图片

这个问题还有其他更清洁的解决方案吗?
我的教授告诉我们,我们可以像这样将对象映射到 id,而不是实际定义具有正确属性的表:
id (int) | Serialized Object (blob)
1 10010110110
Run Code Online (Sandbox Code Playgroud)
我可以看到很多问题;数据冗余,必须单独跟踪 id,必须将整个表拉入内存以搜索任何内容,**如果我想在 Java 代码中更改我的模型,我将不再能够反序列化存储在数据库到该模型。
要么我永远坚持那个模型,要么我必须做一些其他非常丑陋的事情来改变我的模型。**这整件事对我来说似乎是糟糕的形式。我有理由不同意我的教授吗?这样做有什么我没有想到的好处吗?如果我是对的,我应该对我的教授说些什么吗?他向我全班宣讲了这一点,甚至说他是用这种方式建造项目的。第二个意见会很棒。
该课程名为软件设计。
我的教授并没有说这是最好的方法,但他确实说这是定义关系表的合理替代方法。
该模型在任何方面都不是动态的。
我需要在项目上设置历史功能以跟踪先前的更改。
假设我现在有两个表:
NOTES TABLE (id, userid, submissionid, message)
SUBMISSIONS TABLE (id, name, userid, filepath)
示例:我在笔记中有一行,用户想要更改消息。我想在更改之前和更改之后跟踪它的状态。
在这些表中的每一个中设置一列的最佳方法是什么,该列将说明某个项目是否“旧”。0 如果活动或1 如果删除/不可见。
我还想创建一个历史 ( AUDIT TRAIL) 表,其中包含id先前状态的 ,id新状态的 ,这些 id 与哪个表相关?
为了让这个问题对未来的读者有用,我将使用通用数据模型来说明我面临的问题。
我们的数据模型由 3 个实体组成,它们应标记为A、B和C。为了简单起见,它们的所有属性都将是int类型。
实体A具有以下属性:D,E和X;
实体B具有以下属性:D,E和Y;
实体C具有以下属性:D和Z;
由于所有实体共享公共属性D,我决定应用类型/子类型设计。
重要提示:实体是互斥的!这意味着实体是 A 或 B 或 C。
实体A和B还有另一个共同的属性E,但是这个属性并不存在于实体中C。
如果可能的话,我想使用上述特性来进一步优化我的设计。
老实说,我不知道如何做到这一点,也不知道从哪里开始尝试,因此这篇文章。
在我们的 SQL Server 上,我们为每个 Web 应用程序都有一个数据库。对于报表,我们使用 Reporting Services,所有报表数据(包括报表参数)都来自存储过程。
存储过程与报表中的数据位于同一数据库中。因此,例如,服务于 Stock 报告的 proc 位于 Stock 数据库中。一些报告显示来自多个数据库的信息,然后 proc 将位于这些源数据库之一中。报告参数从具有商店、员工等数据的企业数据库中的 procs 获取数据。
这意味着所有报告都至少有一个到 Enterprise 数据库的连接和另一个到另一个数据库的连接——有时甚至更多。
我的问题是:将报告过程移动到单独的“报告”数据库中是否有好处。我知道将报告移动到另一台服务器上的好处,我不是在谈论那个——这将在同一台服务器上。
可能影响这一点的事情是:
请让我知道你的想法。
database-design ×10
mysql ×2
sql-server ×2
audit ×1
datatypes ×1
foreign-key ×1
schema ×1
subtypes ×1