我在rails中有一个方法就是这样做:
a = Foo.new("bar")
a.save
b = Foo.new("baz")
b.save
...
x = Foo.new("123", :parent_id => a.id)
x.save
...
z = Foo.new("zxy", :parent_id => b.id)
z.save
Run Code Online (Sandbox Code Playgroud)
问题是我添加的实体越多越长.我怀疑这是因为它必须为每条记录命中数据库.由于它们是嵌套的,我知道在父母得救之前我无法拯救孩子,但我想立刻拯救所有的父母,然后是所有的孩子.做一些像这样的事情会很好:
a = Foo.new("bar")
b = Foo.new("baz")
...
saveall(a,b,...)
x = Foo.new("123", :parent_id => a.id)
...
z = Foo.new("zxy", :parent_id => b.id)
saveall(x,...,z)
Run Code Online (Sandbox Code Playgroud)
这只会在两次数据库命中时完成.有没有一种简单的方法可以在rails中执行此操作,或者我一次只执行一次?
我有一个存储过程有一堆输入和输出参数,因为它是将值插入多个表.在某些情况下,存储过程仅插入到单个表中(取决于输入参数).这是一个模拟的场景来说明.
表/数据对象:
人
Id
Name
Address
Run Code Online (Sandbox Code Playgroud)
名称
Id
FirstName
LastName
Run Code Online (Sandbox Code Playgroud)
地址
Id
Country
City
Run Code Online (Sandbox Code Playgroud)
假设我有一个插入人的存储过程.如果地址不存在,我将不会将其添加到Address数据库中的表.
因此,当我生成调用存储过程的代码时,我不想打扰添加Address参数.对于INPUT参数,这是可以的,因为SQL Server允许我提供默认值.但是对于OUTPUT参数我在存储过程中做什么使它成为可选的,所以我没有收到错误...
过程或函数'Person_InsertPerson'需要参数'@AddressId',这是未提供的.
有没有人知道为给定类自动生成数据库表的方法?我不是在寻找一个完整的持久层 - 我已经有了一个我正在使用的数据访问解决方案,但我突然要从大量的类中存储大量信息而且我真的不想创建所有这些表都是手工制作.例如,给定以下类:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private int property2;
public int Property2
{
get { return property2; }
set { property2 = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我期待以下SQL:
CREATE TABLE Foo
(
Property1 VARCHAR(500),
Property2 INT
)
Run Code Online (Sandbox Code Playgroud)
我也想知道你如何处理复杂的类型.例如,在之前引用的类中,如果我们将其更改为:
class Foo
{
private string property1;
public string Property1
{
get { return property1; }
set { property1 = value; }
}
private System.Management.ManagementObject …Run Code Online (Sandbox Code Playgroud) 关于使用事务从数据库中读取的看法似乎有很多不同.
来自DeveloperWorks文章的引用交易策略:模型和策略概述:
如果您只是在阅读数据,为什么还需要交易?答案是你没有.启动事务以执行只读操作会增加处理线程的开销,并可能导致数据库上的共享读锁(取决于您使用的数据库类型以及隔离级别设置的内容).
作为相反的意见,Hibernate文档中有以下引用非事务性数据访问和自动提交模式
我们的建议是不在应用程序中使用自动提交模式,并且仅在具有明显性能优势或未来代码更改的可能性很小时才应用只读事务.无论您是读取还是写入数据,始终更喜欢常规ACID事务来对数据访问操作进行分组.
也有EclipseLink的邮件列表上一个类似的争论在这里.
真相在哪里呢?交易是否为最佳实践?如果两者都是可行的解决方案,使用交易的标准是什么?
据我所知,只有隔离级别高于'read committed'才会有所不同.它是否正确?
有哪些经验和建议?
我已经注意到O(1)在讨论涉及散列和搜索类型的算法时的一些非常奇怪的用法,通常是在使用语言系统提供的字典类型的上下文中,或者使用使用数组使用的字典或散列数组类型 - 索引符号.
基本上,O(1)意味着以恒定时间和(通常)固定空间为界.一些非常基本的操作是O(1),尽管使用中间语言和特殊虚拟机往往会扭曲思考的人(例如,如何将垃圾收集器和其他动态过程分摊到O(1)活动之外).
但是忽略了延迟,垃圾收集等的摊销,我仍然不明白如何假设某些涉及某种搜索的技术可以是O(1),除非在非常特殊的条件下.
虽然我之前已经注意到这一点,但是在Pandincus问题中出现了一个例子,"'正确'集合用于在C#.NET中获取O(1)时间内的项目?" .
正如我在那里所说的那样,我所知道的唯一一个提供O(1)访问作为保证边界的集合是一个带有整数索引值的固定绑定数组.假设通过一些映射到随机存取存储器来实现该阵列,该存储器使用O(1)操作来定位具有该索引的单元.
对于涉及某种搜索以确定不同类型索引(或具有整数索引的稀疏数组)的匹配单元的位置的集合,生活并不那么容易.特别是,如果存在可能的碰撞和拥堵,则访问不完全是O(1).而如果集合是灵活的,必须认识和摊销扩大基础结构的成本(如树或哈希表),其纾缓交通挤塞(例如,高发病碰撞或树的不平衡).
我永远不会想到将这些灵活和动态的结构称为O(1).然而,我认为它们作为O(1)解决方案提供,而没有任何必须保持的条件,以确保实际上具有O(1)访问(以及使该常数可忽略地小).
问题:所有这些准备都是一个问题.O(1)的偶然性是什么?为什么这么盲目地被接受?是否认识到即使O(1)可能不合需要地大,即使接近常数?或者O(1)只是将计算复杂性概念挪用于非正式用途?我很困惑.
更新:答案和评论指出了我自己定义O(1)的习惯,我已经修复了.我仍然在寻找好的答案,在一些情况下,一些评论主题比他们的答案更有趣.
持久性无知通常被定义为持久化和检索标准.NET对象的能力(如果您真的坚持给它们命名,则为POCO).一个看似公认的标准.NET对象定义是:
"...普通的课程,你专注于手头的业务问题而不添加与基础设施相关的原因......"
但是,我看到人们将NHibernate描述为一个允许持久性无知的框架,但它是一个不能在任何标准.NET对象上工作的框架,只有符合特定设计要求的标准.NET对象,例如(源代码):
(旁白:在任何人不高兴之前,我并不打算在这里选择NHibernate,它只是一个经常被引用的框架示例,据说允许持久性无知.我敢肯定类似的论点可以应用于其他声称相同的ORM .)
现在虽然这个类本身没有任何持久性特定于框架的属性或基类等,但对我而言,它实际上并不是"持久性无知",因为它必须遵循一套设计指南以便于所选持久性框架的使用.您必须考虑到持久性框架的要求来设计和实现该类; 如果你不了解它,那么这个班可能无法使用它.
当我在与"持久性无知" /"POCO"的定义问题是,我不知道怎么样,从概念上讲,这是真的有什么不同,以添加属性,如[Serializable]或[DataContract]或[XmlType]或任何其他持久性框架,具体的注解这有利于使用该框架的实体的持久性和检索.
那么,"持久性无知"到底是什么?
很明显,将它定义为能够持久化"普通类"是一种谬误,因为NHibernate只是在没有引用特定于框架的类的情况下是普通的,而它们非常特殊,因为它们需要不寻常的设计选择,例如默认构造函数和所有类-virtual成员和可变类型的Equals/GetHashCode实现.
因此,当对象促进使用持久性框架(在设计和结构中或通过使用特定于框架的注释)但不执行任何持久性逻辑时,"持久性无知"是否合理?
我是第一次做大项目.我有很多类,其中一些有公共变量,一些有setter和getter方法的私有变量,同样有两种类型.
我决定重写此代码,主要只使用一种类型.但我不知道应该使用哪个(仅用于同一对象中的方法的变量始终是私有的,并且不受此问题的影响).
我知道公共和私人意味着什么,但在现实世界中使用什么以及为什么?
我正在构建一个应用程序,我想将多个查询批处理到一个数据库的往返.例如,假设单个页面需要显示用户列表,组列表和权限列表.
所以我存储了procs(或者只是简单的sql命令,比如"select*from Users"),我想执行其中的三个.但是,为了填充这一页,我必须进行3次往返.
现在我可以编写单个存储过程("getUsersTeamsAndPermissions")或执行单个SQL命令"select*from Users; exec getTeams; select*from Permissions".
但我想知道是否有更好的方法来指定在一次往返中进行3次操作.好处包括更容易进行单元测试,并允许数据库引擎将查询并行化.
我正在使用C#3.5和SQL Server 2008.
关于具有NoSQL数据库的事务脚本,有一个类似的主题,但这一个是关于模式的.从我发现的事务脚本,它根本不是面向对象的.它基本上是程序代码,尽管它可以在其代码的每一行中使用对象.
更好的解决方案是使用域模型,与活动记录或数据映射器相结合,具有工作单元/身份映射/延迟加载/查询对象等.事务脚本可能很容易使用,但它实际上是程序编程,因此应该被视为面向对象世界的反模式.
你怎么看?您是否同意交易脚本是反模式的?或者你真的有办法设计一个面向对象的事务脚本而不是伪装的程序吗?我怀疑这是可能的.
我有点害怕问这个问题,因为它可能会开始一场宗教战争,所以我想要清楚地知道我在寻找什么.我正在寻找一个理由,为什么你会或者已经或者已经跳过了某种方式以及将项目添加到我的列表中.我正在寻找大票,大爆炸物品.此外,产品特定的项目,如果它们真的相关,也许.此时我正在尝试评估ORM与手动而不是产品A与产品B.
ORM优势
- Quick to code and low maintenance (in some/most scenarios) - Additional features for "free" (no developer effort)
手工编码优势
- More Efficient (at runtime, maybe not at dev time?) - Less layers of complexity - Most ORMS seem to struggle with being retricted to sprocs only
为了充分披露,我真的不喜欢"某事"对我的数据库执行代码的想法,我无法直接修改,如果我认为合适,但我可以看到ORM的潜在大量开发时间优势.
它也许值得注意我在.Net世界
[编辑](使用ORM或普通SQL的问题?似乎回答了许多问题并强调了关于性能的观点)
所以,稍微改变我的问题
有没有在早期阶段使用ORM构建应用程序,然后逐渐用手动编码的DAL替换?这种方法的缺陷是什么?
[进一步编辑 - 现在解决问题的核心]让一个网站能够对我的数据库执行任何SQL是可怕的.如果通过sprocs进行所有访问,我的数据库将保持良好,安全,舒适的隔离.使用专门的sprocs删除了很多(如果不是全部)SQL注入攻击向量.对此有何评论?
data-access ×10
c# ×2
orm ×2
sql-server ×2
.net ×1
abstraction ×1
activerecord ×1
ado.net ×1
c++ ×1
collections ×1
database ×1
nhibernate ×1
oop ×1
poco ×1
search ×1
transactions ×1