我应该为每个用户使用唯一表吗?

时间:2014-01-22 15:23:23

标签: sql mongodb sql-server-2012 mongodb-.net-driver

我正在开发一个网络应用程序,用于收集使用我服务的网站的流量信息。想想谷歌分析,但更直观。我正在使用SQL Server 2012作为我的应用程序的主干,我正在考虑使用MongoDB作为网站的数据收集分析方。

如果我的网站上有100个用户平均每月点击次数达到20,000次,则单个集合中的2,000,000条记录将被查询。

  • 我应该使用MongoDB来存储这些信息(我是新手,新的东西是令人生畏的)?
  • 我应该为每个新用户动态创建新的集合/表吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

使用MongoDB,集合(也称为sql表)可以变得非常大而没有太多问题。这主要是它的设计目标。 Mongo是HuMONGOus的一部分(非常聪明呃)。这对于mongodb来说非常有用,它非常适合存储时间点信息。

选项:

1。每个客户的新集合

非常容易我为此

使用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

好处:

  • 如果一个客户需要自行分享,则易于分割数据
  • 可能与问题的大脑地图相匹配

缺点:

  • 几乎不可能对所有集合进行汇总数据
  • 在管理工作室(如robomongo)很难找到收藏品

2。一大集合

使用一个集合全部以这种方式访问​​

var coll =  MongoStuff.GetCollection<Record>("Records");    

在表格上放一个索引(索引会使读取数量级更快)

coll.EnsureIndex(new IndexKeysBuilder().Ascending("ClientId"));

只需运行一次(每个集合,每个索引)

好处:

  • 查找数据的一个简单位置
  • 汇总所有客户
  • 更传统的Mongodb设置

缺点:

  • 所有客户数据混合
  • 可能也没有精神上的地图

仅作为参考,尺寸的mongodb限制在这里: [http://docs.mongodb.org/manual/reference/limits/] [1]

3。仅存储汇总数据

如果您从不打算分解为单个记录,只需保存聚合本身。

Page Loads : 
#    Page            Total Time      Average Time 
15   Default.html    1545            103

答案 1 :(得分:1)

我会让别人解决你问题的MongoDB方面,因为我觉得我不是评论它的最佳人选,我会指出MongoDB是一个非常不同的动物,你会失去很多您喜欢在SQL中使用的RI。

就SQL设计而言,我不会为每种客户方法使用不同的模式。您的数据库架构和备份可能无法控制地增长,维持动态增长的架构将是一场噩梦。

我建议采用以下两种方法之一:

您可以为每个客户创建一个新数据库:

  • 这更安全,因为用户无法访问彼此的数据(只使用不同的凭据),用户更容易管理/迁移和分离。
  • 然而,许多托管服务提供商对每个数据库收费,运营和维护成本会更高,如果您希望比较用户之间的数据,则会更具挑战性。

您的第二种方法是简单地将所有用户托管在一个数据库中,您的表会变大(尽管维护良好的SQL DB有200万行不会超过顶部)。您只需使用UserID列进行区分。

  • 重点是通过适当的索引来获得所需的性能
  • 用户的数据将存在于同一个系统中,对于访问对方数据的用户没有SQL防御 - 您的代码必须是好的!