图表数据的核心数据模型设计

时间:2014-05-19 16:50:55

标签: ios objective-c core-data

我很抱歉这个冗长的解释,但我确实觉得有必要解释一下细节,以便我能够以最好的方式获得帮助,以创建正确的核心数据模型来满足我的要求。

我只是想找出创建数据模型的最佳方法,以便我能够以快速有效的方式实现以下目标,而目前我的MySQL设置目前无法实现。我使用MySQL从服务器返回所有值,但现在希望使用CoreData来缓存这些数据,并且只下载新的日期数据。

我有一个存储数据集的数据库:

{
    "Agent_Id" = 32;
    "Order_FinalisedDate" = "2014-05-17 03:39:54";
    "Order_Id" = 2596;
    "Order_ReferenceNumber" = "Pavan/0905/016";
    "PieChart_Id" = 13585;
    "PieChart_QuantityATOP" = 150;
    "PieChart_TotalAmount" = 52500;
    "Product_Id" = 20;
}

每次加载viewController时,我都有13,585个这些数据集从服务器中传入。处理从服务器检索的数据需要1分半钟。这是非常低效的,我寻求创建一个核心数据模型,以帮助我按时大幅减少流程。

这是没有核心数据的当前流程

  1. 我只关注过去12个月,就像过去12个月银行如何退回您的账户一样。因此,我以JSON格式从服务器获取一个实时动态数组,将它们很好地复制到名为BankDateDataModel的数组中的自定义monthsChartDataDictionary数据模型中,该数组以此格式yyyy-MM存储数据。

  2. 然后,我会检查所有销售情况并抓取并对其进行分类,如果它的日期可以与monthsChartDataDictionary数组中的匹配日期相关联。

    //Go through each data set
    for(id key in JSONDictionary){
        //First lets store each data set which we will use for another process.
        PieChartSliceDataModel *pcs = [[PieChartSliceDataModel alloc] initWithJSONData:key];
        [allPieChartDataArray addObject:pcs];
    
        /**
            Check to see if we have a date entry in the format of `yyyy-MM`
            If there is a 
        */
    
        if([monthsChartDataDictionary objectForKey:pcs.PCS_StringOrderFinalisedDate]){
            [[monthsChartDataDictionary objectForKey:pcs.PCS_StringOrderFinalisedDate] addObject:pcs];
        }
    }
    

    这基本上就是创建的 - monthsChartDataDictionary。一个字典,其键的格式为yyyy-MM,并且其关联键中包含数据集数组。

    {   //An nsdictionary holding over 13,500 elements.
        "2013-05"=(..,..,..);
        "2013-06"=(..,..,..);
        "2013-07"=(etc);
        "2013-08"=();
        "2013-09"=();
        "2013-10"=();
        "2013-11"=();
        "2013-12"=();
        "2014-01"=();
        "2014-02"=();
        "2014-03"=();
        "2014-04"=();
        "2014-05"=();
    }
    
  3. 然后运行for循环以同时实现两件事,参见下面的a)和b):

    a)对于monthsChartDataDictionary字典中的每个月,我通过计算每个数据集的PieChart_TotalAmount得到该月的总销售额。这用于创建一个折线图,显示全年的总销售额。 enter image description here

    b)制作一个新词典 - finalPieChartData,其中每个键的格式为yyyy-MM,存储的值是一系列产品,显示每个产品的总销售价值。这样可以制作一个饼图,显示在任何给定月份内产品的销售。其中12sp B - 250是产品的名称。 enter image description here

  4. 如何在核心数据模型中最好地代表所有这些?

    我想是否有办法存储所有必需的数据,总销售额也是如此,并且在给定的月份内将产品间的销售分开......所有这些都存储在核心数据中......或者如果它最好在进行这些计算时进行他们从核心数据库中退出,我猜这只会造成更多延迟。

    到目前为止,我有这个:

    enter image description here

    我创造这个的逻辑是基于以下想法:

    1. 我可以拥有一个存储所有单个数据集的数据库
    2. 另一张表格存储折线图的月度总销售额,因此我不必继续执行计算,除非我需要更新最近一个月的销售数据,因为我获得了仍然在同月。
    3. 除了那个montly销售核心数据模型外,还会有一系列饼图切片,代表任何特定月份内每个产品ID的总销售额。这意味着我不必一次又一次地处理计算。
    4. 这是对的吗?有没有一种有效的方法存储一切?

      更新1:更新了建议的核心数据模型,以便在应用程序实现后提高效率

      enter image description here

2 个答案:

答案 0 :(得分:0)

NSDateFormatter对性能非常有害。如果您在映射过程中使用它,则应尽量减少它的分配。如果你不想

,你可以提供第一步的代码片段

您也可以在xcode product-profile-time profiler中使用。它可以帮助您跟踪低性能操作。

至于使用网络服务和核心数据,请查看restKit

此外,您可以在此链接下使用raywenderlich处理网络服务和核心数据part 1 part 2

答案 1 :(得分:0)

对于订单输入系统,您需要服务器端的月初至今(MTD)和年初至今(YTD)表,其中包含以下字段:更新日期,总销售额和订单总数。表格应与订单一起更新或每晚批量更新。该应用程序只需下载MTD数据即可生成所需的销售图表。为MTD表创建本地存储可能有一些价值,但是数据量减少可能没有必要。

如果需要过滤,请考虑为所需过滤器创建单个表(MTD),而不是尝试制表和重新计算应用中的所有内容。