Questions tagged «database-design»

数据库的概念模式和/或逻辑模型和/或物理设置的开发。

2
不测试一项功能还可以吗?
您是否在任何时候都对语言/数据库/系统如此熟悉,从而无需测试新功能/配置/查询/等。在系统中实施之前进行了包含/模拟的测试(特别是涉及修改数据的功能)?还是在测试环境中通过仿真测试新查询总是必不可少的吗? 为了进一步说明,很显然,测试始终是最安全的。但是,是否有办法确定何时风险很小,以至于不值得进行测试?措辞的另一种说法是:什么时候或曾经有专业的实践来承担实施功能的风险? 另外,我们假设所有内容都已备份,因此,在最坏的情况下,可以轻而易举地恢复数据。 有人可以引用特定的专家经验来解决此问题吗?请在适当/可能的地方提供参考。

4
5列以上的主键对大型(1亿+)表不利吗?
我正在阅读有关一些现实生活中的数据库问题的信息,一个项目有一个拥有1亿行的表格,其中有5列作为主要表格。我认为这很糟糕,但是有人可以告诉我原因吗? 该表有点像微型汇总/汇总表,因此5列是(天,market_id,product_id ...)。起初,我认为5列主键并不理想,但我想多了一点,我真的无法提出一个很好的理由来说明它不好。 这是在半夜与公司一半的工程师进行的讨论中。一位高级工程师同意,有人刚刚提到这是一个糟糕的设计,但没人真正了解原因。因此尝试自己研究问题!

3
CouchDB和文档版本控制
我目前正在使用CouchDB开发一个具有Wiki风格的应用程序,并且正在尝试实现文档版本控制方案。我看到它的方式有两种: 将每个版本存储为单独的文档 将较旧的版本存储为单个文档的附件。 现在,我有一种排名第一的工作方式。当用户编辑文档并保存时,后端首先将以前的修订版本复制到新文档中,然后保存新版本。每个文档都有一个“历史”数组,其中包含每个版本的数据(旧版本的文档_id,时间戳,编辑器等)。 由于此历史记录数组对于经常更新的文档可能会很漫长,因此我有一个视图,该视图在正常读取期间会获取没有历史记录的文档(还有另一个用于获取历史记录的视图)。 我的问题是:我对目前的方法感到不安,并一直在考虑更改为“附件”方法。但我不确定。我希望有一个比我更了解CouchDB的人(我才来这两个星期了-这是我的第一个使用CouchDB和NoSQL的项目)可以告诉我每种方法的优缺点方法。还是有其他我忽略的版本控制方案?

2
复合主键效率作为外键
我有一个带有复合主键(由4列组成)的表,该键用于确保没有重复项输入到表中。我现在需要一个新表,该表需要将该表中的键作为外键引用。 我的问题是哪种方法对查找速度更有效: 1)我是否创建包括所有4列的新表,并在外键中引用它们。 要么 2)我是否在主键表中创建了一个新的标识列,并将其用作新表中的外键。 预计该数据库将存储大量数据,因此到目前为止,我已经建立了该数据库,以最大程度地减少每个表中存储的数据量。考虑到这一点,选项2将是最好的方法,因为我将为每行保存2个int列和一个datetime列,但是我想避免不必要的增加查找时间。


2
SQL Server数据库设计用于“已存档但可用”的数据
我们有一个打算“缩小”的大型数据库(> 1TB)。数据库围绕一个主要实体,我们称其为“访问”。为了讨论起见,假设它是医学实践的数据库。 总共有30种访问“类型”,例如程序,年度,随访,免疫等,每种类型都是“访问”的辅助表,例如“ visit_immuno”。 自2000年以来,该数据库已积累了大约12年的数据。有人建议我们在“实时”版本中保留大约3年的数据,而其余数据则保留在“ old_data”数据库中。由于日期已标准化,因此仅存储在“访问”表中。Visit表还包含一个ROWVERSION列和一个BIGINT伪身份(聚集)列。出于所有目的和目的,假设群集密钥由SEQUENCE(SQL Server 2012 Enterprise)填充-我们将其命名为cid。 在visit.date当医生的推移延长探视,并与他的数据的“公文包”的回报并不总是以相同的顺序作为聚集键,例如,它被合并到主表。“访问”表也进行了一些更新,这将导致该ROWVERSION列与cid和date列不同步-简单地说,由于这个原因,它们都ROWVERSION不会cid创建合适的分区键。 从“活动”中删除数据的业务规则是,visit.date必须大于36个月并且visit_payment必须存在子记录。另外,“ OLD_DATA”数据库不包含任何基本表visit%。 因此,我们最终得到: 直播DB(日常使用) -所有表老数据DB -对于较旧的数据visit%表 该提案要求使用组合DB,该组合DB是一个外壳,其中包含(除外)中所有基本表的同义词以及两个数据库中所有表的UNION ALL的视图。Live DBvisit%visit% 假设在Old-Data数据库中创建了相同的索引,查询在UNION-ALL 视图上的性能是否良好?哪种类型的查询模式可能会使UNION-ALL 视图的执行计划失败?

4
为何在Oracle中不使用可为空的数字?
我们的公司正在与另一个软件公司进行联合项目,有人告诉我们,如果不应显示特定值,则应传递-5000(它们的任意哨兵值);原因是在Oracle数据库(现在是以前的Oracle开发人员)的建议下,Oracle数据库中没有number列支持空值。该公司还用VB6编写了他们的绝大多数代码(慢慢地过渡到VB.NET,这是另一天的话题...)。出于纯粹的好奇心,此建议是否有任何正当理由?我想不起我这边。 -编辑 感谢您的反馈。我在CodeProject.com(链接)上提出了相同的问题,并收到了非常相似的反馈。似乎唯一可以证明这种做法正确的时间与外键有关,我可以说它们在系统中的任何地方都不使用外键。做出此决定的开发人员(我曾经在该公司工作)比我拥有更多的经验,因此我想确保在发生嘲笑之前没有正当的理由。

2
对多个查询列使用相同的CASE WHEN条件
是否存在一种“更好”的方式来重写SELECT子句,其中多个列使用相同的CASE WHEN条件,以便仅检查条件一次? 请参见下面的示例。 SELECT CASE testStatus WHEN 'A' THEN 'Authorized' WHEN 'C' THEN 'Completed' WHEN 'P' THEN 'In Progress' WHEN 'X' THEN 'Cancelled' END AS Status, CASE testStatus WHEN 'A' THEN authTime WHEN 'C' THEN cmplTime WHEN 'P' THEN strtTime WHEN 'X' THEN cancTime END AS lastEventTime, CASE testStatus WHEN …

2
位与布尔列
假定位字段只是数据的二进制表示形式,则需要以稍微“奇怪”的方式进行查询。 使用位字段作为布尔值实际上有什么好处吗?从我看来,这似乎表明空间是唯一的真正好处。

5
调查数据库设计:将答案与用户相关联
我正在为调查数据库做概念模型。 目标是存储用户给出的答案(这将是一个Android应用程序)。 我有三个实体:用户,问题和选项。 一个问题将有一个或多个选项(例如:您有多少名员工? 1-40,40-1000,+1000)。 选项将包含一个文本(1-40)和一个值(用户选择的值)。 用户将选择一个(或多个)这些选项。 我的概念设计是: 我不知道如何将答案与用户相关联。 我如何代表这种关系? 我是否有另一个实体代表期权价值? 该模型将存储问题和预制答案(提供的答案),并允许它们在不同的调查中重复使用。 我必须代表这样的问题: 这个问题与此有关:调查数据库设计:第一个版本。有错误吗?

4
如何在没有表的数据库中存储数据?
我在学校中学到的只是SQL,它将数据保存到表中。现在,我正在一个项目中,数据存储在XML文件中。此外,每个XML都包含对可视文件(JPEG)的引用。 XML本身包含一千多个坐标点,以及有关数据的其他信息。 我认为将这些信息存储在表中没有任何意义。此外,我也无法使用SQL存储JPEG文件。 什么是合适的解决方案,或者我的推理存在错误? 如您所见,我对数据库还很陌生。因此,欢迎提出任何建设性的建议,链接和建议。

2
有多少存储过程参数太多?
我刚刚开始在SQL Server 2008中编写存储过程,并且有30多个参数。我从来没有写过超过10个参数,而这让我开始思考...什么时候有太多参数? 对于背景...这个程序基本上将INSERT单列成一个单一的表。也将有一个非常相似的地方。尽管稍小;对同一张表执行UPDATE的版本。大多数列相对较小,混合使用int和字符串(varchar(200))。 有什么问题;是好是坏; 一个具有大量参数的程序,我应该开始考虑其他模式的门槛是什么?

2
正确的技术来存储用户事件数据
在数据库设计方面,我大多是自学成才。我提出这个问题是因为我已经确定了这种通用结构,但是想知道这是最有效还是“行业标准”的方法。 我设计的大多数数据库都有一个用户表,然后在另一个表中跟踪人员活动。我知道数据库的优点是具有这种效率,但是活动表将定期从每个定期使用它的用户中迅速收集许多事件,因此,在中等用户使用率的情况下,活动表将很快成为一个巨大的表。这是让它以这种方式发展的最佳实践吗?是表的层,还是根据日期,用户数量或其他原因拆分为不同的表? +--------------------+ +------------------------+ | UserData | | Activity | +-=------------------+ +------------------------+ | ID (auto uint) | <--1-to-many-+ | ID (auto uint) | | UserName (text) | +--> | UserID (uint) | | Email (text) | | Timestamp (time) | | additional info... | | Type (ID to elsewhere) | …


3
如何实现具有最大属性数量未知的实体?
我正在设计一个棒球模拟程序,但是在设计boxscore模式时遇到了问题。我的问题是我想跟踪每个局得分多少次。我在实际程序中执行此操作的方法是使用一个动态数组,该数组随所播放的每个局而增长。 对于那些不熟悉棒球比赛的人,通常比赛会长9局,除非比赛在第9局结束时并列。因此,棒球比赛的长度没有确定,这意味着我不能设计数据库仅将9列记录为每一局的得分(技术上来说是18列(9局* 2队)。我不得不想到的是序列化数组并在将其存储到数据库之前将其编码为Base64,但是,我不知道这是否是一种很好的技术,我想知道是否有人有更好的主意。 万一重要,我正在开发的数据库是PostgreSQL。 任何建议,不胜感激!谢谢!

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.