Questions tagged «best-practices»

最佳实践通常和非正式地被认为是随着时间的推移显示出优于通过其他方式实现的方法和过程。


4
我应该明确拒绝不应该更新的列吗?
我习惯在非常安全的环境中工作,因此我将权限设计为非常精细。我通常要做的一件事是显式地DENY使用UPDATE不应该更新的列的功能。 例如: create table dbo.something ( created_by varchar(50) not null, created_on datetimeoffset not null ); 设置值后,永远不要更改这两列。因此,我明确DENY了UPDATE他们的权限。 最近,在一个团队会议中,开发人员提出了一个观点,即确保字段永远不会更新的逻辑应该包含在应用程序层而不是数据库层中,以防“他们出于某种原因需要更新值”。对我来说,这听起来像是典型的开发者心态(我知道,我曾经是一个!) 我是公司的高级架构师,我一直致力于使应用程序正常运行所需的最少特权。所有权限都会定期审核。 在这种情况下,最佳做法是什么?

7
通过将街道地址分成多个单独的列可以解决哪些问题?
我们有一个团队为软件开发人员设计表格和关系。在我们的组织中,他们对执行3NF标准化非常严格-坦白地说,鉴于我们的组织规模以及需求或客户随时间的变化,我同意。我对他们的设计决定背后的原因只有一个不清楚的地方:地址。 虽然这主要针对美国的地址,但我认为这可以适用于任何这样做的国家。地址的每个部分在地址表中都有自己的列。例如,以这个肮脏的美国地址为例: Attn: Jane Doe 485 1/2 N Smith St SW, APT 300B Chicago, IL 11111-2222 它会像这样在数据库中拆分: 街道号:485 街道分数:1/2 街道定向:N(北) 街道名称:史密斯 街道类型:ST(街道) 街后:SW(西南) 城市:芝加哥 州:IL(伊利诺伊州) 邮政编码:11111 邮政编码:2222 国家(假设为美国) 注意:Jane Doe 邮政信箱:NULL 居住类型:APT(公寓) 居住人数:300B 并且还会有其他几列与乡村路线和合同路线相关。此外,我们的特定应用程序可能会包含一些国际地址。数据建模人员表示,他们将添加特定于国际地址的列,即通常的第1行,第2行字段。 起初我以为这太过分了。反复进行在线研究是指使用地址行1、2、3和可能的4,然后划分城市,地区和邮政编码。对于这种粒度很有用的新应用程序,我们确实有一个用例。我们必须验证用户没有创建重复业务,并且检查地址是验证之一。我们可以使其与地址线1和2一起使用,但这会更加困难。 对于我们的特定应用程序,我们需要为企业和个人存储多种地址(实体地址,邮件地址,运输地址等)。我们可能需要生成可打印的套用信函,但到目前为止尚未讨论该要求。 我们组织中的应用程序还需要支持其他一些功能: 审核(带有完整的历史记录表) 打印邮件标签 生成打印表格 报告(针对国家和地区政府) 虽然我们的应用程序可能无法像其他应用程序那样做所有事情,但是将地址拆分为多个组件是我工作的企业标准。无论我们的应用程序是否将从中受益,我们都被迫这样做。 半相关的StackOverflow问题:一个好的地址解析器在哪里被关闭,但是它说明了解析地址有多困难。 为了让我更好地了解他们的设计决策,并向我们的客户推销该想法... 将街道地址分为几列可以解决哪些问题? 对于实施了这样的系统的任何人,如果他们遇到了问题,就会获得加分。

4
要安全地重新启动承载Microsoft SQL Server的计算机,必须执行哪些步骤?
重新启动承载MS SQL Server实例的服务器时,是否有必要采取特殊步骤来防止数据损坏? 例如,最近我遇到了手动停止SQL服务的建议。我的理解是,这是由Windows shutdown进程处理的。 我敢肯定,就像我刚才提到的那样,每个人都可以推荐不计其数的步骤,但是我想避免重复过时或迷信的做法。是否有Microsoft的建议或广泛的行业标准? 此问题与重新启动计算机的短期过程有关。还有一个长期问题,那就是在永久性关闭机器之前,确保机器不被使用的长期程序。

5
仍然是避免将默认端口用于SQL Server的最佳实践吗?
从历史上看,作为安全最佳实践的一部分,建议不要使用默认端口连接到SQL Server。在具有单个默认实例的服务器上,默认情况下将使用以下端口: SQL Server服务-端口1433(TCP) SQL Server浏览器服务-端口1434(UDP) 专用管理员连接-端口1434(TCP) 问题: 这个建议仍然有用吗? 是否应该更改上述所有端口?


5
表别名是不好的做法吗?
我记得在DBMS课程中为信息服务硕士课程的学生学习过这一点。为了节省输入时间,您可以输入: SELECT t1.id, t2.stuff FROM someTable t1 INNER JOIN otherTable t2 ON t1.id=t2.id ; 但是...为什么在存储过程之类中可以接受?似乎这样做只会损害语句的可读性,同时又节省了很少的时间。有任何功能或逻辑上的理由要这样做吗?似乎增加了歧义而不是消除了歧义。我看到使用这种格式的唯一可以接受的原因是,如果要添加一个语义上有意义的别名(例如,FROM someTable idsTable当表名的描述性不足时)。 表别名是不好的做法还是只是滥用有用的系统?

3
什么效率更高,使用where子句或使用具有百万个以上行表的联接?
我们运行的网站在一个表中有250MM行,而在大多数查询中,与之连接的另一个表中的行都不到15MM。 样本结构: MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows UserTable (Id, Role, Created, UserName...) -- 12K Rows 我们通常必须对所有这些表进行一些查询。一种是获取免费用户(约1万个免费用户)的统计信息。 Select Count(1) from DetailsTable dt join MasterTable mt on mt.Id = dt.MasterId join UserTable ut on ut.Id = mt.UserId where ut.Role is null and …

2
SQL Server-增长数据库文件的最佳实践
我已经通过SQL Server 2008 R2中的数据收集器监视文件增长了两个星期。该数据库以每天约35(MB)的速度持续增长。该数据库尚未达到2 GB的初始大小。 数据库文件的自动增长设置为5MB,我想尝试另一种方法,所以我正在寻找建议和/或评论。 每个星期天晚上1:30 AM都会运行一项调优任务。该任务将: 检查数据库完整性 缩小日志文件–(可以,因为日志记录模式很简单) 收缩数据库 重组索引 重建索引 更新统计 清理历史 我想在每周调整计划中增加两个步骤: 如果使用的空间达到某个阈值或总大小,则将数据库文件增加500 MB。 如果使用的空间达到总大小的特定阈值,则将日志文件增加250 MB(缩小后)。 通过将增长负担放在离线时间,我希望通过减少重负载下的自动增长事件的数量来提高性能。 我有两个有关自动增长文件的问题。 放置文件增长步骤的最佳位置是在当前步骤之前还是之后? 如果我使用ALTER DATABASE|MODIFY FILE来增大文件,那么如何确定是否SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)呢?


3
事务日志备份是串行还是并行?
我们碰巧正在使用SQL Server 2012 Standard Edition。我也碰巧使用Ola Hallengren的脚本来提供简单,灵活的框架来进行备份和维护。 这个问题不是关于Ola的脚本,而是关于最佳实践。我意识到最终的答案是“这取决于您公司的要求”。但是,我试图就如何最好地满足我对公司要求的理解,征询社区的建议。 我希望每15分钟设置一次事务日志备份。这样,我们希望丢失的数据不会超过15分钟。我应该设置一项使用ALL_DATABASES的作业吗?还是为每个数据库设置一项工作并并行启动它们?我问,因为我有一种基于Ola脚本运行方式的感觉,即备份是以串行方式启动的。串行的缺点是每个连续的备份要等到另一个完成为止。这可能会增加备份之间的时间量(即,大于15分钟)。另外,我担心的是,一个备份失败会阻止其他备份的发生,我不希望这样。我希望其他人继续备份。 那么Ola的脚本是串行执行的,还是失败会停止连续的备份,这是真的吗? 每个数据库都有一份工作更好吗?或仅完成一项工作?我倾向于单独的工作,但是我希望了解SQL Server DBA通常会做什么。

3
最佳实践SQL Server维护计划是什么样的?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我是埃因霍温丰提斯大学的一名学生,我目前正在进行一系列访谈,以帮助开发SQL Server工具,并且我希望获得该领域专家的反馈。 我的问题之一是: 最佳实践SQL Server维护计划是什么样的?您为此使用SQL Server维护计划,还是使用自定义脚本?

2
有关关系数据库中的查找表的最佳实践是什么?
查找表(或某些人称为代码表)通常是可以为特定列提供的可能值的集合。 例如,假设我们有一个查找表party(用于存储有关政党的信息),该表具有两列: party_code_idn,其中包含系统生成的数值,并且(缺少业务域的含义)可以用作实键的替代。 party_code是表的实键或“自然”键,因为它维护具有业务域内涵的值。 让我们说这样的表保留了以下数据: +----------------+------------+ | party_code_idn | party_code | +----------------+------------+ | 1 | Republican | | 2 | Democratic | +----------------+------------+ 在party_code列,这使价值“共和”和“民主”,在工作台的真正的关键,是建立了一个独特的约束,但我需要添加的party_code_idn,它定义为表(的PK虽然,从逻辑上说,party_code可以用作主键[PK])。 题 指向事务表中的查找值的最佳实践是什么?我是否应该建立外键(FK)引用(a)直接指向自然和有意义的值,或者(b)替代值? 例如,选项(a), +---------------+------------+---------+ | candidate_idn | party_code | city | +---------------+------------+---------+ | 1 | Democratic | Alaska | | 2 | Republican | Memphis | …

1
如何为小型Web团队设置本地数据库开发过程?
背景 我正在为一个由约4位程序员和4位设计师组成的小型Web团队创建一个新的开发过程,并有望在未来发展该团队。我们的产品是一个中央应用程序,可为我们设计和托管的客户网站提供支持。 以前,我们都通过FTP在开发服务器上使用单个开发数据库进行工作。有效” *了一段时间,但我们正在进入一个新的发展方向,所以它是成熟的时间我们的进程。 我们使用Percona Server 5.5,但这应该是数据库不可知的,其思想是保持低成本。 目标: 我正在考虑为数据库开发创建一个持续集成(CI)流程,请注意以下几点: 开发人员拥有本地数据副本以针对其运行开发代码 能够将数据库结构回滚到以前的变更集 能够将新功能架构更改与架构设计修订更改分开 能够在本地修改数据库结构以进行测试 初始概念 我已经在下面使用SVN和LiquiBase勾勒出了一个过程,尽管它完全删除了#4。 从主干创建一个“开发”分支 中央“开发”数据库服务器从“开发”分支运行 本地开发人员被设置为开发分支的奴隶(#1上面提供) liquibase变更集定期提交给开发分支,该分支执行提交后挂钩以更新中央开发数据库(它将滴流到作为该开发服务器的从属服务器运行的本地计算机)(liquibase #2上面提供了) 当功能或模式修订准备好进行质量检查时,DBA(我)将把适当的更改从开发分支合并到主干中。此操作将创建一个SQL脚本以应用于暂存数据库服务器。 登台服务器应反映TRUNK,该结构应与Production具有相同的结构,以及质量检查中的更改 在登台服务器上执行sql脚本后,请对更改进行一些质量检查。 如果一切看起来不错,请标记结构。这将生成.sql脚本,以供DBA在生产环境中手动运行(如果需要,请在非高峰时间运行) 此过程要求所有开发人员都在同一个“开发”分支下运行,这意味着在任何给定时间仅存在一个数据库模式版本(不确定我是否需要此版本)。 这也意味着对模式的任何更改都无法在本地进行测试,如果操作不当,可能会影响其他开发人员。在我们的环境中,开发人员可能会添加新表,但很少修改现有结构。作为DBA,设计修复工作由我完成。但是无法在本地测试修复程序是我最大的困扰。 如何调整上述过程以允许本地开发,同时仍保持数据的相对最新副本(如我建议的过程中的复制所提供的那样)?我不需要直到上周的最新数据。 * “有效”是指足够,但是PITA。

6
在MySQL中拆分表。好的做法?
我已经开始研究一个现有项目,并且以前的开发人员已将一个表拆分为10个具有相同模式但数据不同的单独表。 这些表如下所示: [tableName_0] [tableName_1] [tableName_2] [tableName_3] [tableName_4] [tableName_5] [tableName_6] [tableName_7] [tableName_8] [tableName_9] 主键是一个整数id字段。该应用程序使用哈希算法(idmod 10)来知道在查找时要访问哪个表。例如id= 10将导致[tableName_0]。 这些表加起来可能有100,000行,并且增长率相对较低。 因此,我的问题是,这是否是可行的解决方案,或者即使在任何情况下都是好的做法。我的理论是推动将它们组合在一起,因为这样会使事情变得更容易,直到UNIONs等。主要缺点是更改所有应用程序代码以及从长远来看是否值得。

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.