Questions tagged «database-design»

数据库设计是指定数据库的结构以及逻辑方面的过程。数据库设计的目的是代表某种“话语世界”-事实的类型,业务规则和数据库要建模的其他要求。

8
仍然对识别与非识别关系感到困惑
因此,我一直在阅读数据库设计中的识别关系与非识别关系,关于SO的许多答案似乎与我矛盾。这是我正在查看的两个问题: 识别和非识别关系有什么区别 确定身份关系或非身份关系的麻烦 查看每个问题的最高答案,我似乎对确定的关系有两种不同的想法。 第一个问题的回答是,标识关系“描述了子表中行的存在取决于父表中行的情况”。给出的一个示例是:“作者可以写很多书(一对一关系),但是没有作者就不能存在一本书。” 这对我来说很有意义。 但是,当我读到对第二个问题的回答时,我很困惑,因为它说:“如果孩子确定了其父母,那是一种确定的关系。” 然后答案继续给出示例,例如社会安全号码(用于识别一个人),但没有地址(因为许多人可以住在一个地址上)。对我来说,这听起来更像是在主键和非主键之间做出决定的情况。 我自己的直觉(以及在其他站点上的其他研究)指出第一个问题及其答案是正确的。但是,我想在继续前进之前先进行验证,因为在努力理解数据库设计时,我不想学习任何错误。提前致谢。

8
标准使用“ Z”而不是NULL来表示丢失的数据?
除了是否应使用NULL之外,我还负责一个现有数据库,该数据库使用NULL表示“丢失或从未输入”数据。它不同于空字符串,它表示“用户设置了该值,并且他们选择了'空'”。 该项目的另一个承包商坚决主张“对于我来说不存在NULL;我从不使用NULL,并且任何人都不应使用NULL”。但是,令我困惑的是,由于承包商的团队确实承认“缺少/从未输入”和“故意空着或由用户指示为未知”之间的区别,因此他们在整个代码和存储过程中使用单个字符“ Z”表示“缺少/从未输入”,在整个数据库的其余部分中的含义与NULL相同。 尽管我们共享的客户要求更改此设置,而我也支持此要求,但是该团队将其称为比我更先进的DBA中的“标准做法”。他们不愿意仅根据我的无知请求更改为使用NULL。那么,有人可以帮助我克服我的无知吗?在SQL专家中,是否有任何标准或一小群人,甚至是一个大声的提倡使用“ Z”代替NULL的人? 更新资料 我有承包商的回应要补充。当客户要求删除特殊值以允许无数据列中的NULL时,他说的是这句话: 基本上,我设计数据库时要尽可能避免NULL。这是基本原理: •不需要在字符串[VARCHAR]字段中使用NULL,因为空(零长度)字符串会提供完全相同的信息。 • 整数字段(例如,ID值)中的NULL可以通过使用数据中永远不会出现的值(例如,整数IDENTITY字段为-1)来处理。 • 日期字段中的NULL会很容易导致日期计算复杂化。例如,在计算日期差异(例如[RecoveryDate]和[OnsetDate]之间的天数差异)的逻辑中,如果一个或两个日期为NULL,则逻辑将爆炸-除非为两个日期都明确允许为NULL。那是额外的工作和额外的处理。如果[RecoveryDate]和[OnsetDate]使用“默认”或“占位符”日期(例如“ 1/1/1900”),则数学计算可能会显示“异常”值-但日期逻辑不会爆炸。 传统上,NULL处理是开发人员在存储过程中犯错的领域。 在我作为DBA的15年中,我发现最好尽可能避免使用NULL。 这似乎证实了对该问题的大部分消极反应。不是使用公认的6NF方法来设计NULL,而是使用特殊值来“尽可能避免NULL”。我以开放的态度发表了这个问题,很高兴我了解到更多有关“空值有用/空值很邪恶”的辩论,但是现在我很乐意将“特殊值”方法标记为完全废话。 空(零长度)字符串将提供完全相同的信息。 不,不是。在我们正在修改的现有数据库中,NULL表示“从未输入”,空字符串表示“输入为空”。 传统上,NULL处理是开发人员在存储过程中犯错的领域。 是的,但是成千上万的开发人员已经犯下了数千次错误,而且避免这些错误的教训和警告也广为人知并记录在案。如此处所述:无论您接受还是拒绝NULL,缺失值的表示都是一个已解决的问题。无需仅仅因为开发人员不断犯下易于克服(且易于识别)的错误而发明新的解决方案。 作为一个脚注:我已经成为DBE和开发人员已有20多年了(对于我来说,足够时间了解数据库工程师和数据库管理员之间的区别)。在我的整个职业生涯中,我一直都处于“ NULL是有用的”阵营,尽管我知道几个非常聪明的人不同意。我对“特殊价值”方法非常怀疑,但是对“如何避免以正确方式避免NULL”的学术知识不够扎实。我一直喜欢学习新事物,而且20年后我仍然有很多东西要学习。感谢所有为此做出有益讨论的人。

9
什么时候最好将标志存储为位掩码而不是使用关联表?
我正在开发一个应用程序,其中用户具有使用不同功能(例如读取,创建,下载,打印,批准等)的不同权限。权限列表不会经常更改。我有几个关于如何在数据库中存储这些权限的选项。 在什么情况下,选择2会更好? 选项1 使用关联表。 用户 ---- 用户名(PK) 名称 部 允许 ---- PermissionId(PK) 名称 用户权限 ---- 用户ID(FK) PermissionId(FK) 选项2 为每个用户存储一个位掩码。 用户 ---- 用户名(PK) 名称 部 权限 [Flags] enum Permissions { Read = 1, Create = 2, Download = 4, Print = 8, Approve = 16 }

30
关系数据库中的空值可以吗?[关闭]
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 2个月前关闭。 改善这个问题 有一种流派认为在关系数据库中不应该允许空值。也就是说,表的属性(列)不应允许空值。来自软件开发背景,我真的不明白这一点。似乎如果null在属性的上下文内有效,则应允许该值。这在Java中非常普遍,在Java中对象引用通常为null。没有丰富的数据库经验,我想知道我是否在这里缺少什么。

9
数据库设计:计算帐户余额
如何设计数据库以计算帐户余额? 1)目前,我从交易表中计算帐户余额。在我的交易表中,我有“说明”和“金额”等。 然后,我将所有“金额”值相加,得出用户的帐户余额。 我向我的朋友展示了这个,他说这不是一个好的解决方案,当我的数据库增长缓慢时?他说我应该创建一个单独的表来存储计算出的帐户余额。如果这样做,我将不得不维护两个表,这很冒险,帐户余额表可能会不同步。 有什么建议吗? 编辑:选项2:我应该在我的交易表“余额”中添加一个额外的列。现在,我不需要遍历很多数据来执行计算。 示例John购买了$ 100的信用额,他负债了$ 60,然后又增加了$ 200的信用额。 金额$ 100,余额$ 100。 金额-$ 60,余额$ 40。 金额$ 200,余额$ 240。

24
使用浮点数还是小数作为会计应用程序的美元金额?
我们正在VB.NET和SQL Server中重写旧的记帐系统。我们引入了一个新的.NET / SQL程序员团队来进行重写。大多数系统已经使用浮动金额以美元金额完成。我编程的传统系统语言没有浮点数,因此我可能会使用十进制。 您有什么建议? 浮点数或小数数据类型应用于美元金额吗? 两者都有哪些利弊? 我们每天的讨论中提到的一个骗局是,当您计算返回的结果超过两位小数时,必须小心。听起来您必须将金额四舍五入到小数点后两位。 另一个缺点是所有显示和打印量必须具有显示两个小数位的格式语句。我注意到有几次没有这样做,金额看起来不正确。(即10.2或10.2546) 优点是浮点数仅占用磁盘上的8个字节,而十进制将占用9个字节(十进制12,2)

7
主键和身份之间有什么区别?
在SQL Server数据库中,主键和标识列之间有什么区别?列可以是主键,而不必相同。但是,如果没有主键,则列不能是标识。 除了差异之外,PK和“身份”列还提供什么,而仅PK列不提供?

7
在应用程序中支持自定义字段的设计模式是什么?
我们开发了一个商业应用程序。我们的客户要求定制领域的支持。例如,他们想在“客户”表单中添加一个字段。 存储字段值和有关字段的元数据的已知设计模式是什么? 我现在看到这些选项: 选项1:将varchar类型的Field1,Field2,Field3,Field4列添加到我的Customer表中。 选项2:在客户表中添加XML类型的单列,并将自定义字段的值存储在xml中。 选项3:添加带有varchar类型的列的CustomerCustomFieldValue表,并将值存储在该列中。该表还将具有一个CustomerID,一个CustomFieldID。 CustomerID, CustomFieldID, Value 10001, 1001, '02/12/2009 8:00 AM' 10001, 1002, '18.26' 10002, 1001, '01/12/2009 8:00 AM' 10002, 1002, '50.26' CustomFieldID将是来自另一个名为CustomField的表的ID,其中包含以下列:CustomFieldID,FieldName,FieldValueTypeID。 选项4:添加带有每个可能值类型的列的CustomerCustomFieldValue表,并将值存储在右列中。与#3相似,但字段值使用强类型列存储。 CustomerID, CustomFieldID, DateValue, StringValue, NumericValue 10001, 1001, 02/12/2009 8:00 AM, null, null 10001, 1002, null, null, 18.26 10002, 1001, 01/12/2009 8:00 AM, null, …

3
在数据库中设计月度订阅系统的良好实践[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我想知道如何在数据库中设计每月订阅软件系统。这些系统在Internet上广泛使用,尽管我找不到很多有关数据库设计的内容。 就我而言,这些元素(也许我忘记了一些其他元素)必须包括在内: 客户 计划(如“基本” /“高级”)。每个计划都有每月的价格和一定数量的信用(例如:基本计划每月提供30个信用,而高级计划则提供无限信用)。 积分是在应用程序内花费的虚拟货币。 订阅/取消订阅 付款(请注意,由于折扣等原因,实际支付的价格可能与计划的基本价格有所不同) ...? 除了数据库设计之外,可能还需要设置触发器来执行此操作(?)。 我的痛点: 我看不到总体上这是什么整体设计 数据库中哪一行应该是:month_susbscrition(即每个客户每月1行)或订阅本身(即每个客户1行)? 您将如何处理每月订阅的自动续订? 如果您打算使用Paypal之类的服务来处理每月自动付款,您将如何处理付款设计? 注意 我自愿不详细说明我的需求,因为这样一来,辩论可能会变得笼统,对其他人更有用。 感谢帮助。

15
复合主键与唯一对象ID字段
我继承了一个数据库,该数据库的构想是复合键比使用唯一对象ID字段更理想,并且在构建数据库时,永远不要将单个唯一ID用作主键。因为我正在为此数据库构建一个Rails前端,所以遇到使它符合Rails约定的困难(尽管可以使用自定义视图和一些其他gem来处理复合键)。 编写此特定架构设计背后的原因与编写数据库的方式有关,这与数据库如何以非有效方式处理ID字段以及在构建索引时树型排序有缺陷。这种解释没有任何深度,我仍在尝试围绕这个概念(我熟悉使用复合键,但并非100%的时间)。 任何人都可以对此主题发表意见或增加深度吗?

9
如何在PhpMyAdmin的左侧菜单中列出所有表格?
有谁知道如何在PhpMyAdmin的左侧菜单中列出每个表(禁用分页)?我的数据库中有250多个表,现在我们看到了分页。来回移动非常烦人,将它们全部列出会容易得多。 我们发现以下变量: $cfg['LeftDisplayTableFilterMinimum'] = 30 但是,当我将其放入配置文件时,它似乎没有任何影响。 在说明中将其设置为较大数量以使其禁用的文档中,我们也尝试了该尝试,但没有成功。 任何帮助将不胜感激!

3
系统表master..spt_values的用途是什么,其值的含义是什么?
系统表master..spt_values的目的是什么? 为什么提供它,以及应该如何使用它? 它的类型,低,高值的含义是什么? 更新: Google搜索提供了成千上万的“用途”,例如: 使用master..spt_values拆分列 它包含从0到2047的数字。这非常有用。例如,如果您需要用这个范围内的100个数字填充表格 用于建立索引 创建虚拟日历 以某种非直觉和复杂的方式获取使用对象的描述 枚举SQL Server数据库中的所有索引(Giuseppe Dimauro,devx.com) “ SQL Server 2005脚本显示磁盘空间使用情况” “这不值得谈论。此表是“超级”查找表的设计梦are” 一些帖子警告不要使用它,因为它可以在将来的SQL Server版本中删除,但是已经有代码脚本使用它来说明新的SQL Server 11(Denali)的新功能: 仅在SQL Server Denali中使用OFFSET N ROWS FETCH NEXT N ROWS才能轻松分页

16
动态数据库架构
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4个月前关闭。 改善这个问题 为动态逻辑数据库架构提供存储的推荐体系结构是什么? 需要说明的是:在要求系统为模型提供存储的情况下,其模型可能会在生产后由其用户扩展或更改,那么有哪些好的技术,数据库模型或存储引擎可以做到这一点? 一些可能性来说明: 通过动态生成的DML创建/更改数据库对象 创建具有大量稀疏物理列的表,并且仅使用“重叠”逻辑架构所需的表 创建一个“狭长”表,将动态列值存储为行,然后需要对其进行透视以创建一个“短,宽”行集,其中包含特定实体的所有值 使用BigTable / SimpleDB PropertyBag类型系统 任何基于现实世界经验的答案将不胜感激


12
MySQL存储过程使用或不使用它们
我们正处于一个新项目的开始,我们真的想知道是否应该在MySQL中使用存储过程。 我们将仅使用存储过程来插入和更新业务模型实体。有几个表代表模型实体,我们将在那些存储过程的插入/更新中对其进行抽象。 另一方面,我们可以从Model层调用插入和更新,但是不能在MySQL中而是在PHP中。 根据您的经验,哪个是最佳选择?两种方法的优点和缺点。就高性能而言,哪一个最快? PS:这是一个大多数阅读的Web项目,而高性能是最重要的要求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.