我正在开发一个网络应用程序,用于收集使用我服务的网站的流量信息。想想谷歌分析,但更直观。我正在使用SQL Server 2012作为我的应用程序的主干,我正在考虑使用MongoDB作为网站的数据收集分析方。
如果我的网站上有100个用户平均每月点击次数达到20,000次,则单个集合中的2,000,000条记录将被查询。
谢谢!
答案 0 :(得分:2)
使用MongoDB,集合(也称为sql表)可以变得非常大而没有太多问题。这主要是它的设计目标。 Mongo是HuMONGOus的一部分(非常聪明呃)。这对于mongodb来说非常有用,它非常适合存储时间点信息。
选项:
非常容易我为此
使用GetCollectionSafe方法public class MongoStuff
private static MongoDatabase GetDatabase()
{
var databaseName = "dbName";
var connectionString = "connStr";
var client = new MongoClient(connectionString);
var server = client.GetServer();
return server.GetDatabase(databaseName);
}
public static MongoCollection<T> GetCollection<T>(string collectionName)
{
return GetDatabase().GetCollection<T>(collectionName);
}
public static MongoCollection<T> GetCollectionSafe<T>(string collectionName)
{
//var db = GetDatabase();
var db = GetDatabase();
if (!db.CollectionExists(collectionName)) {
db.CreateCollection(collectionName);
}
return db.GetCollection<T>(collectionName);
}
}
然后你可以打电话给:
var collection = MongoStuff.GetCollectionSafe<Record>("ClientName");
运行此脚本
static void Main(string[] args)
{
var times = new List<long>();
for (int i = 0; i < 1000; i++)
{
Stopwatch watch = new Stopwatch();
watch.Start();
MongoStuff.GetCollectionSafe<Person>(String.Format("Mark{0:000}", i));
watch.Stop();
Console.WriteLine(watch.ElapsedMilliseconds);
times.Add(watch.ElapsedMilliseconds);
}
Console.WriteLine(String.Format("Max : {0} \nMin : {1} \nAvg : {2}", times.Max(f=>f), times.Min(f=> f), times.Average(f=> f)));
Console.ReadKey();
}
给我(在我的笔记本电脑上)
Max : 180
Min : 1
Avg : 6.635
好处:
缺点:
使用一个集合全部以这种方式访问
var coll = MongoStuff.GetCollection<Record>("Records");
在表格上放一个索引(索引会使读取数量级更快)
coll.EnsureIndex(new IndexKeysBuilder().Ascending("ClientId"));
只需运行一次(每个集合,每个索引)
好处:
缺点:
仅作为参考,尺寸的mongodb限制在这里: [http://docs.mongodb.org/manual/reference/limits/] [1]
如果您从不打算分解为单个记录,只需保存聚合本身。
Page Loads :
# Page Total Time Average Time
15 Default.html 1545 103
答案 1 :(得分:1)
我会让别人解决你问题的MongoDB方面,因为我觉得我不是评论它的最佳人选,我会指出MongoDB是一个非常不同的动物,你会失去很多您喜欢在SQL中使用的RI。
就SQL设计而言,我不会为每种客户方法使用不同的模式。您的数据库架构和备份可能无法控制地增长,维持动态增长的架构将是一场噩梦。
我建议采用以下两种方法之一:
您可以为每个客户创建一个新数据库:
您的第二种方法是简单地将所有用户托管在一个数据库中,您的表会变大(尽管维护良好的SQL DB有200万行不会超过顶部)。您只需使用UserID列进行区分。