无论我们是否喜欢,很多人(如果不是大多数)开发人员要么经常使用数据库,要么可能有一天必须使用数据库.考虑到野外滥用和滥用的数量,以及每天出现的数据库相关问题的数量,可以说开发人员应该知道某些概念 - 即使他们没有设计或使用数据库今天.所以:
保持清单简短.
每个答案的一个概念是最好的.
要具体.
"数据建模"可能是一项重要技能,但这恰恰意味着什么呢?
解释你的理由.
为什么你的概念很重要?不要只说"使用索引".不要陷入"最佳实践".说服您的观众了解更多信息.
Upvote您同意的答案.
首先阅读其他人的答案.一个排名较高的答案是比两个排名较低的答案更有效的陈述.如果您要添加更多内容,请添加评论或引用原始评论.
不要因为它不适用于你个人而投票.
我们都在不同的领域工作.这里的目标是为数据库新手提供指导,以获得对数据库设计和数据库驱动开发的有充分理解和全面理解,而不是争夺最重要的标题.
我目前正在报告系统中使用MongoDB,并且必须删除一大堆测试文档.虽然使用基于JSON的命令行工具没有太多麻烦,但是必须继续搜索文档,复制和粘贴OID等,特别是从命令提示符窗口(曾经尝试过),这非常繁琐."标记"包装多行的文本?)
一个快速的谷歌搜索没有太多(只是一个Mac工具),但我想我会在这里问.
我意识到在功能集方面不可能有任何与SQL Server Management Studio相近的东西,但至少有类似的东西吗?只是允许我在视觉上检查数据库和集合,执行一些简单的CRUD任务并在适当的窗口(不是DOS提示符)中管理多个脚本的东西?
如果没有,是否正在进行任何工作?如果我知道自己在寻找什么,我甚至可能愿意做出贡献,但我似乎无法找到一丝暗示,有人可能正在考虑为Windows构建这样的东西.
如果有人能指出我正确的方向,我会很感激.
假设您有一个名为Customer的类,其中包含以下字段:
我们还要说,根据您的业务逻辑,所有Customer对象都必须定义这四个属性.
现在,我们可以通过强制构造函数指定每个属性来轻松地完成此操作.但是,当您被迫向Customer对象添加更多必需字段时,很容易看出它会如何失控.
我已经看到了在构造函数中加入20多个参数的类,使用它们只是一种痛苦.但是,或者,如果您不需要这些字段,则可能会遇到未定义信息的风险,或者更糟糕的是,如果您依赖调用代码来指定这些属性,则会引发对象引用错误.
有没有替代方案,或者你只需要决定X的构造函数参数是否太多,你不能忍受?
35线,55线,100线,300线?什么时候应该开始分手?我问,因为我有60行(包括评论)的功能,并且正在考虑将它分开.
long_function(){ ... }
Run Code Online (Sandbox Code Playgroud)
成:
small_function_1(){...}
small_function_2(){...}
small_function_3(){...}
Run Code Online (Sandbox Code Playgroud)
这些函数不会在long_function之外使用,因为较小的函数意味着更多的函数调用等.
你什么时候将一个函数拆分成更小的函数?为什么?
谢谢大家的答案,编辑列表并投票给出正确的答案,我会选择那个;)
我现在正在重构这些想法:)
我将不得不使用SQL Server的BULK INSERT命令重写一些相当旧的代码,因为架构已经改变,而且我想到也许我应该考虑用TVP切换到存储过程,但我想知道是什么影响它可能有性能.
一些背景信息可能有助于解释我为什么问这个问题:
数据实际上是通过Web服务提供的.Web服务将文本文件写入数据库服务器上的共享文件夹,该文件夹依次执行BULK INSERT.这个过程最初是在SQL Server 2000上实现的,当时除了INSERT在服务器上丢失几百个语句之外别无选择,这实际上是原始进程并且是性能灾难.
将数据批量插入永久登台表,然后合并到更大的表中(之后将其从登台表中删除).
要插入的数据量是"大",但不是"巨大的" - 通常是几百行,在极少数情况下可能是5-10k行.因此,我的直觉是,BULK INSERT作为一个非记录操作不会产生那么大的差异(但当然我不确定,因此问题).
插入实际上是一个更大的流水线批处理过程的一部分,需要连续多次发生; 因此性能是至关重要的.
我想BULK INSERT用TVP 取代的原因是:
在NetBIOS上编写文本文件可能已经花费了一些时间,而且从架构的角度来看它非常可怕.
我相信可以(而且应该)消除临时表.它的主要原因是插入的数据需要在插入的同时用于其他几个更新,并且尝试从大量生产表进行更新比使用几乎空的分段更加昂贵表.使用TVP,参数基本上是临时表,我可以在主插入之前/之后用它做任何我想做的事情.
我几乎可以废除欺骗检查,清理代码以及与批量插入相关的所有开销.
如果服务器同时获得一些这些事务,我们无需担心登台表或tempdb上的锁争用(我们尽量避免它,但它会发生).
在将任何内容投入生产之前,我显然会对此进行分析,但我认为在我花费所有时间之前首先询问周围可能是一个好主意,看看是否有任何人有关于为此目的使用TVP的任何严厉警告.
那么 - 对于那些对SQL Server 2008足够惬意的人来说,或者至少已经对此进行了调查,那么判决是什么?对于插入,比方说,几百到几千行,经常发生,TVP切割芥末?与批量插入相比,性能是否存在显着差异?
(又名:测试结果)
最终的结果是在感觉像36阶段部署过程之后的生产中.两种解决方案都经过了广泛测试
SqlBulkCopy直接使用该类;只是让读者可以得到一个想法是什么确切地进行了测试,以消除任何怀疑这个数据的可靠性,这里是什么这个导入过程更详细的解释实际上做:
从时间数据序列开始,通常约为20-50个数据点(尽管有时可能会达到几百个);
做一大堆疯狂的处理,主要是独立于数据库.该过程是并行化的,因此(1)中的大约8-10个序列同时被处理.每个并行过程生成3个附加序列.
取所有3个序列和原始序列并将它们组合成一批.
将所有8-10个现已完成的加工任务的批次合并为一个大型超级批次.
使用BULK INSERT策略(请参阅下一步)或TVP策略(跳至步骤8)导入.
使用SqlBulkCopy该类将整个超级批处理转储到4个永久临时表中.
运行存储过程,(a)对其中两个表执行一系列聚合步骤,包括几个JOIN条件,然后(b)MERGE使用聚合和非聚合数据执行6个生产表.(成品)
要么
生成DataTable包含要合并的数据的4个对象; 其中3个包含CLR类型,遗憾的是ADO.NET TVP不能正确支持它们,因此必须将它们作为字符串表示形式推入,这会对性能造成一定影响.
将TVP馈送到存储过程,该过程基本上与(7)进行相同的处理,但是直接与接收的表一起进行.(成品)
结果相当接近,但TVP方法最终平均表现更好,即使数据少量超过1000行. …
performance bulkinsert sql-server-2008 table-valued-parameters
我当前的非编译代码与此类似:
public abstract class A { }
public class B { }
public class C : A { }
public interface IFoo<T>
{
void Handle(T item);
}
public class MyFoo<TA> : IFoo<TA>, IFoo<B>
where TA : A
{
public void Handle(TA a) { }
public void Handle(B b) { }
}
Run Code Online (Sandbox Code Playgroud)
C#编译器拒绝编译它,引用以下规则/错误:
'MyProject.MyFoo <TA>'无法同时实现'MyProject.IFoo <TA>'和'MyProject.IFoo <MyProject.B>',因为它们可能会统一某些类型参数替换
我理解这个错误意味着什么; 如果TA可以是任何东西那么它在技术上也可能B会引入两种不同Handle实现的模糊性.
但TA 不可能是任何东西.基于类型层次结构,TA 不能是B- 至少,我不认为它可以. TA必须派生自A,而不是 …
MSDN文档告诉我以下内容:
GZipStream类使用gzip数据格式,该格式包括用于检测数据损坏的循环冗余校验值.gzip数据格式使用与DeflateStream类相同的压缩算法.
似乎GZipStream在输出中添加了一些额外的数据(相对于DeflateStream).我想知道,在什么类型的场景中使用GZipStream而不是DeflateStream是必不可少的?
这里有一点背景:
我知道数据仓库是什么,或多或少.我已经阅读了数十个关于数据仓库的指南,我玩过SSAS,我知道什么是星型模式,维度表和事实表,我知道ETL是什么以及如何做. 这不是"如何"问题或教程请求.
我的问题是,我读过的关于数据仓库的所有材料似乎都掩盖了构建数据仓库的基本原理.它们都具有象征性,或者在某些情况下字面上以" 所以你决定建立一个数据仓库...... " 这句话开头.除了我还没有做出那个决定.
因此,我希望SO成员可以指出或帮助提出某种半客观测试.我可以适应特定系统并最终得到"是的,我们需要一个数据仓库"或"不,今天的收益太小了".我认为我应该能够回答的具体问题是:
在什么时候构建数据仓库是一个值得考虑的选择?换句话说,我应该注意哪些标志,指标或其他标准可能表明标准的交易环境不再足够?
全面数据仓库有哪些替代方案?事务数据库中的非规范化和沼泽标准复制的"报告服务器"是我想到的两个; 在进入DW之前,还有其他我应该探索的吗?
为什么数据仓库比上述备选方案更好?如果答案是"它取决于",那么它依赖于什么?
什么时候不应该尝试构建数据仓库?无论背景如何,我都对所谓的"最佳实践"持怀疑态度.肯定有一些情况下DW是错误的选择 - 它们是什么?
是否有任何实际的例子我可以看一下通过引入数据仓库而改进的系统?可以向我解释的东西,端到端,他们需要仓库的决策或分析,他们如何决定放入什么,以及仓库最终如何适应更大的环境?我不想要一个人为的"让我们从AdventureWorks数据库中创建一个多维数据集" - 实现与我无关,我对所涉及的规范和设计以及整体思考过程感兴趣.
我一般不会问多方,但我认为这些都是非常密切相关的.我愿意接受至少解决前4个问题的任何答案,尽管最后一个问题确实有助于在我的脑海中明白这一点.如果有人已经写过关于这一点的链接很好,只要它们相当简洁和具体(链接到Ralph Kimball的主页=无用).
希望我已经明确了问题 - 提前感谢你的答案!
我不知道为什么我开始考虑这个,但现在我似乎无法停止.
在C#中 - 可能还有很多其他语言,我记得Delphi曾经让你这么做 - 编写这种语法是合法的:
class WeirdClass
{
private void Hello(string name)
{
Console.WriteLine("Hello, {0}!", name);
}
public string Name
{
set { Hello(name); }
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,该属性有一个setter但没有getter,它是只写的.
我想我无法想到为什么这应该是非法的,但我从来没有真正在野外看过它,而且我似乎在野外看起来非常精彩/可怕的代码.这似乎是一种代码味道; 似乎编译器应该给我一个警告:
CS83417:属性"名称"似乎完全无用且愚蠢.糟糕的程序员!考虑用方法替换.
但也许我只是没有做足够长的时间,或者为了看到任何有效使用这种结构的例子而在一个太狭窄的领域工作.
是否存在只写属性的现实示例,这些示例要么不能被直接方法调用替换,要么变得不那么直观?
我需要将POST操作设置为绝对URL(例如,http://www.cnn.com).有没有办法使用Html.BeginForm()帮助程序并传递它的URL?
c# ×2
coding-style ×2
database ×2
refactoring ×2
.net ×1
asp.net-mvc ×1
bulkinsert ×1
compression ×1
constructor ×1
forms ×1
function ×1
generics ×1
html ×1
mongodb ×1
oop ×1
parameters ×1
performance ×1
properties ×1
windows ×1