gpt4 book ai didi

.net - 是否有 NOSQL 数据层设计模式?

转载 作者:行者123 更新时间:2023-12-04 01:11:58 25 4
gpt4 key购买 nike

很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。 visit the help center 帮助澄清这个问题以便重新打开它。




10年前关闭。




我已经看到了一些类似的想法,而不是像 Create、Update、Insert、Delete (CRUD) 使用 Get 和 Put。那挺好的。但是,我还没有看到太多关于如何处理复杂性的内容。有人告诉我,“只需为您需要的每种查询类型编写一个方法”。

在我开始考虑限定符(where 子句)之前,大多数 NOSQL 对我来说似乎都不错——可能会有很多变化。是否已经有一个很好的方案来以合理的方式实现限定符,只使用方法名称和参数约定?也许有某种动词/名词方案效果很好,但它本身并不是一种语言。

我不追求“正确”的答案……我希望有一些我可以学习的思想流派。

从 RavenDB 的制造商处找到这篇博文:http://ayende.com/blog/4562/ravendb-index-management

我们可以在一个类上实现多个索引吗?

我什至发现可以序列化匿名委托(delegate) http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/06/20/how-to-serialize-anonymous-delegates.aspx 我想如果这是可能的,他们可能会使用这样的东西。

但是,如果我们无法访问相同的程序集(例如 Silverlight)怎么办。在这里找到这篇文章:
http://ayende.com/blog/4766/accessing-ravendb-from-silverlight
IEnumerable<T> 对象是在客户端还是服务器端搜索的?我们在 NOSQL 中的服务器端在通过网络发送回之前缩小结果集的范围有多具体,而不会将其锁定到一个唯一的 id?

更新:我最终从 RavenDB 给 Ayende 发送了电子邮件。他友好地回答了我的问题(如下):

What you can do is write:


  public IEnumerable<T> FindAll(Expression<Func<T,bool>> whereClause)
{
return session.Query<T>().Where(whereClause).ToList();
}

This uses linq to figure out your intent, and then sends the query to the server using RavenDB's syntax. On the server, we analyze your query, and the query optimizer checks to see if there is an existing index that can answer this query, and if there isn't, it will create a temporary index for you.

If you query that temporary index enough, RavenDB will make it permanent. Thus, self optimizing its own operations.



您对“来自 Silverlight”用例的了解是否很远?

We are fully supporting Silverlight.



RavenDB 可以处理多个索引服务器端吗?

Yes. In fact, we have some customers that have > 500 indexes running with no issues.



来自 RavenDB 的 Ayende 的信息结束

在设计一种查询语言(即 FindAll/where/delegate)时,mongo 似乎通过 JSON 实现了一点... http://www.mongodb.org/display/DOCS/Indexes 我希望我能更多地了解它。

这听起来更接近: http://www.mongodb.org/display/DOCS/MapReduce

一个关于序列化 Serializing anonymous delegates in C# 的有趣线程。这不是直接相关的......但我只是想稍微了解一下引擎盖,以便我了解更多关于潜力的信息。

最佳答案

我不确定这是否适用于 NoSQL ,但我用 Raven DB 实现了一个通用存储库模式,这是一个片段。

首先,我定义了几个接口(interface)

internal interface ISessionProvider : IDisposable
{
IDocumentSession OpenSession();
void CloseSession();
}

public interface IDataAccessManager : IDisposable
{
void Initialize();
void OpenSession();
void CloseSession();
}

public interface IRepository<T> where T : Entity
{
IQueryable<T> Query();
IEnumerable<T> Find(Func<T, bool> exp);
T FirstOrDefault(Func<T, bool> exp);

void Delete(T entity);
void Add(T entity);
void Save();

string PutAttachment(string key, byte[] data);
Attachment GetAttachment(string key);
void DeleteAttachment(string key);
}

这是一个缩短的实现
internal class SessionProvider : ISessionProvider
{
...

public IDocumentSession OpenSession()
{
session = store.OpenSession();
return session;
}

public void CloseSession()
{
if (session != null)
{
session.Dispose();
}
}
}

public class DataAccessManager : IDataAccessManager
{
...

public void Initialize()
{
store = new DocumentStore
{
ConnectionStringName = ConnectionString
};
store.Initialize();
store.DatabaseCommands.EnsureDatabaseExists(dbName);

provider = new SessionProvider(store);
}

public void OpenSession()
{
session = provider.OpenSession();
}

public void CloseSession()
{
provider.CloseSession();
}
}


public class Repository<T> : IRepository<T> where T : Entity
{
...

public IEnumerable<T> Find(Func<T, bool> exp)
{
return AsQuaribale().Where(exp);
}

public void Add(T entity)
{
session.Store(entity);
}

public void Save()
{
session.SaveChanges();
}

public string PutAttachment(string key, byte[] data)
{
Guid? etag = null;
var metadata = new RavenJObject
{
{"owner", Thread.CurrentPrincipal.Identity.Name},
{"filename", key}
};
session.Advanced.DatabaseCommands.PutAttachment(key, etag, data, metadata);

return key;
}

public Attachment GetAttachment(string key)
{
return session.Advanced.DatabaseCommands.GetAttachment(key);
}

private IQueryable<T> AsQuaribale()
{
return session.Query<T>().Customize(x => x.WaitForNonStaleResultsAsOfNow(Timeout));
}
}

使用示例
private void SendData()
{
try
{
dataManager.OpenSession();
repository = new Repository<MyDomainType>();

...

foreach (string path in paths)
{
//read file to memory
byte[] data = File.ReadAllBytes(path);
string fName = Path.GetFileName(path);
myDomainType.Name = fName;

//save data in memory and metadata to the database
string key = repository.PutAttachment(
myDomainType.Id.ToString(), data);

repository.Add(myDomainType);
}

repository.Save();
}
catch (Exception ex)
{
AppManager.LogException(ex);
}
finally
{
dataManager.CloseSession();
dataManager.Dispose();
}
}

create 的示例测试,它使用 Find (FirstOrDefault) 方法进行断言
[Test]
public void CreateValueTest()
{
var repository = ContainerService.Instance.Resolve<IRepository<DummyType>>();
var expected = new DummyType();
repository.Add(expected);
repository.Save();
DummyType actual = repository.FirstOrDefault(item => item.Id == expected.Id);

Assert.IsTrue(expected == actual);
}

关于.net - 是否有 NOSQL 数据层设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6885206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com