我们假设有一个创建用户的操作.如果存在指定的电子邮件或用户名,则此操 如果失败,则需要确切知道原因.在我看来,有三种方法可以做到这一点,我想知道是否有明显的赢家.
所以,这是一个类用户:
class User
{
public string Email { get; set; }
public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有三种方法可以完成创建操作:
测试创建
if (UserExists(user)) act on user exists error;
if (UsernameExists(user)) act on username exists error;
CreateUser(user);
Run Code Online (Sandbox Code Playgroud)
UserExists和UsernameExists向db服务器发出请求以进行验证.在CreateUser中再次重复这些调用以确保正确使用API.如果验证失败,我会在两种情况下抛出ArgumentOutOfRangeException.因此性能受到了打击.
尝试 - 创建
enum CreateUserResultCode
{
Success,
UserAlreadyExists,
UsernameAlreadyExists
}
if (!TryCreate(user, out resultCode))
{
switch(resultCode)
{
case UserAlreadyExists: act on user exists error;
case UsernameAlreadyExists: act on username exists error;
}
}
Run Code Online (Sandbox Code Playgroud)
这种模式只进行一次验证,但我们采用所谓的错误代码,这不是一种好的做法.
创建,捕捉
try
{
CreateUser(user);
}
catch(UserExistsException)
{ …Run Code Online (Sandbox Code Playgroud) 在Azure Tables中为实体选择分区/行键的最佳做法是什么?常见的建议是在分区大小和分区数之间进行神奇的平衡.但似乎没有人能够通过3个简单的步骤很好地定义如何实现它.是否有一般选择键的方法,以便一切正常?
我有一个D0大小的Cloud SQL实例.当我运行一个简单的
select * from table
Run Code Online (Sandbox Code Playgroud)
它有大约500行,执行平均需要100毫秒(由SQL Prompt报告).而在我的本地MySQL 5.5实例上,它只需要1毫秒.我的开发机器有2.9GHz双核Intel Core i7和8GB 1600MHz内存.我在FAQ中读到db的性能取决于大小 - 较大的实例有更多的RAM和CPU.
通过更大的实例大小来解决性能问题是否合理?或者我在这里错过了其他什么?
我正在设计和实现必须支持Azure存储(表,队列,blob)和AWS存储(EBS,SimpleDB,S3)的.Net ORM,并隐藏通用接口背后的所有实现细节.主要设计目标是简单性.
一些工作已在http://www.cs.virginia.edu/~humphrey/papers/CSAL.pdf中完成,但在我看来,他们建议的界面与Azure/AWS Storage界面紧密耦合,并且如果添加新功能或更改旧功能,可能会中断.例如,我不在乎我可以创建/删除表,我只需要以最有效的方式存储某种类型的对象.
所以,我想问问大家分享的准则表格关于这个问题的经验(DO,考虑,避免不).我真的很感激任何洞察力从设计ORM的一般原则开始,并以精确的抽象级别结束,这更有可能持续考虑Azure和AWS最可能的演进路径.