我正在使用NHibernate建模一个非常基本的ASP.NET MVC应用程序,我似乎陷入了我的设计.这是我模型的草图:
模型1 http://i29.tinypic.com/309614n.jpg
正如你所看到的,这是非常基本的,但我有一些担忧.用户根实体和组织根实体通过两个一对多关系访问同一Organization_Users实体子实体.这似乎不对,我认为我打破了聚合边界.这个模型对我来说很有趣,但我喜欢这个主意,因为我希望有这样的代码:
var user = userRepository.Load(1);
var list = user.Organizations; // All the organizations the user is a part of.
Run Code Online (Sandbox Code Playgroud)
和
var org = orgRepository.Load(1);
var list = org.Users; // All the users in an organization.
Run Code Online (Sandbox Code Playgroud)
表格和角色中的额外数据也将由组织实体使用.这是一个糟糕的设计吗?如果你有任何想法会很棒.我还在试着想一想DDD的想法.谢谢
我创建了一个工厂和一组规范来创建和验证聚合根.目前我对工厂进行了一些测试,这些测试称工厂的产品规格,但我想知道这是否足够.从设计的角度来看,将工厂与其产品的规格相结合可能会更好,因为它们密切相关.
如果聚合根产品的规范用于验证而不是用于创建,那么从工厂内部调用它是否有意义?
或者单位测试是否足够好?
validation domain-driven-design aggregate specification-pattern factory-pattern
我想使用R将具有非唯一rownames的表中的数值数据汇总到具有唯一行名的结果表,其中值使用自定义函数进行汇总.摘要逻辑是:如果最大值与最小值的比率<1.5,则使用值的均值,否则使用中值.因为表非常大,我试图在reshape2包中使用melt()和cast()函数.
# example table with non-unique row-names
tab <- data.frame(gene=rep(letters[1:3], each=3), s1=runif(9), s2=runif(9))
# melt
tab.melt <- melt(tab, id=1)
# function to summarize with logic: mean if max/min < 1.5, else median
summarize <- function(x){ifelse(max(x)/min(x)<1.5, mean(x), median(x))}
# cast with summarized values
dcast(tab.melt, gene~variable, summarize)
上面的最后一行代码会导致错误通知.
Error in vapply(indices, fun, .default) : values must be type 'logical', but FUN(X[[1]]) result is type 'double' In addition: Warning messages: 1: In max(x) : no non-missing arguments to max; returning -Inf …
我在SO上读了一个类似的问题:如何更新Aggregate中的实体,但我仍然不确定用户界面应该如何与聚合内的实体进行交互.
假设我有User一堆,有一堆Addresses.用户是聚合根,而地址仅存在于聚合中.
在Web界面上,用户可以编辑他的地址.基本上,会发生什么:
edit-address?user=1&address=2我决定绕过聚合根,这很简单:
Address它Id因为我们想用DDD方式做,所以我们有不同的解决方案:
我们要求用户通过Id获取此地址:
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
这种方法的问题是,IMO,聚合根仍然没有更多的控制地址的作用.它只返回对它的引用,因此与绕过聚合没有太大区别.
或者我们告诉聚合更新现有地址:
user.updateAddress(id, "12345", "New York");
em.persist(user);
现在,聚合控制了对此地址所做的操作,并且可以采取任何必要的操作来更新地址.
或者我们将地址视为值对象,我们不更新我们的Address,而是删除它并重新创建它:
user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
最后一个解决方案看起来很优雅,但意味着地址不能是实体.然后,如果需要将其视为实体,例如因为聚合中的另一个业务对象具有对它的引用,该怎么办?
我很确定我在这里遗漏了一些东西,以正确理解聚合概念以及它如何在现实生活中使用,所以请不要犹豫,发表您的意见!
我试图使用嵌套聚合函数和分组来获得平均值.我想要做的是:
SELECT AVG(SUM(x) GROUP BY y) WHERE ... GROUP BY ...;
Run Code Online (Sandbox Code Playgroud)
也就是说,对于返回的每一行,我希望其中一个字段是和的平均值,其中每个和是在y相同的行上.
如果可能的话,我想避免使用子选择.
我的SQL有点生疏,我遇到这个问题有点困难.假设我有一个带有Timestamp列和Number列的表.目标是返回包含某个任意选择的常规间隔的平均值的结果集.
因此,例如,如果我有以下初始数据,则间隔为5分钟的结果输出如下:
time value
------------------------------- -----
06-JUN-12 12.40.00.000000000 PM 2
06-JUN-12 12.41.35.000000000 PM 3
06-JUN-12 12.43.22.000000000 PM 4
06-JUN-12 12.47.55.000000000 PM 5
06-JUN-12 12.52.00.000000000 PM 2
06-JUN-12 12.54.59.000000000 PM 3
06-JUN-12 12.56.01.000000000 PM 4
OUTPUT:
start_time avg_value
------------------------------- ---------
06-JUN-12 12.40.00.000000000 PM 3
06-JUN-12 12.45.00.000000000 PM 5
06-JUN-12 12.50.00.000000000 PM 2.5
06-JUN-12 12.55.00.000000000 PM 4
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个Oracle数据库,因此特定于Oracle的解决方案可以正常工作.当然,这可以通过存储过程完成,但我希望在单个查询中完成任务.
我试着通过在data.frame上使用聚合来避免耗时的循环.但我需要其中一列的值进入最终计算.
dat <- data.frame(key = c('a', 'b', 'a','b'),
rate = c(0.5,0.4,1,0.6),
v1 = c(4,0,3,1),
v2 = c(2,0,9,4))
>dat
key rate v1 v2
1 a 0.5 4 2
2 b 0.4 0 0
3 a 1.0 3 9
4 b 0.6 1 4
aggregate(dat[,-1], list(key=dat$key),
function(x, y=dat$rate){
rates <- as.numeric(y)
values <- as.numeric(x)
return(sum(values*rates)/sum(rates))
})
Run Code Online (Sandbox Code Playgroud)
注意:该功能只是一个例子!
这个实现的问题是y=dat$rate在dat上提供所有4个速率,当我想要的只是2个聚合速率!Anny对如何做到这一点有所了解?谢谢!
这是一些示例数据:
dat="x1 x2 x3 x4 x5
1 C 1 16 NA 16
2 A 1 16 16 NA
3 A 1 16 16 NA
4 A 4 64 64 NA
5 C 4 64 NA 64
6 A 1 16 16 NA
7 A 1 16 16 NA
8 A 1 16 16 NA
9 B 4 64 32 32
10 A 3 48 48 NA
11 B 4 64 32 32
12 B 3 48 32 16"
data<-read.table(text=dat,header=TRUE)
aggregate(cbind(x2,x3,x4,x5)~x1, …Run Code Online (Sandbox Code Playgroud) 我正在使用光栅包来降低大栅格的分辨率,使用像这样的函数聚合
require(raster)
x <- matrix(rpois(1000000, 2),1000)
a <-raster(x)
plot(a)
agg.fun <- function(x,...)
if(sum(x)==0){
return(NA)
} else {
which.max(table(x))
}
a1<-aggregate(a,fact=10,fun=agg.fun)
plot(a1)
Run Code Online (Sandbox Code Playgroud)
我必须聚合的光栅图像大得多34000x34000所以我想知道是否有更快的方法来实现agg.fun函数.
这些是Oracle docs的引文:
[可选]通过合并两个聚合上下文合并并返回单个上下文。此操作组合子集上的聚合结果,以获得整个集合上的聚合。在对集合进行串行或并行评估时,可能需要执行此额外步骤。如果需要,它在步骤4之前执行:
,
在此类汇总操作中,将调用ODCIAggregateMerge()接口来计算超级聚合值。
我们有一个聚合函数,我们不想并行运行。
原因是上下文的合并将消耗资源,并且将迫使我们使用与现在使用的数据结构不同的数据结构,从而有效地抵消了并行执行带来的任何性能优势。
因此,我们没有将函数声明为parallel_enabled,而是以防万一的方式返回ODCIAggregateMerge中的ODCIconst.Error。
但是,第一个引用文档声称,即使在串行评估中也可能发生合并。
超级聚合(汇总,多维数据集)是明显的示例,但是还有其他示例吗?
我完全无法通过简单的分组依据来重现它,如果没有parallel_enabled,就永远不会调用merge,并且似乎在该分组中始终只创建一个上下文。
是否可以安全地假设没有parallel_enabled设置,合并将永远不会运行?
您见过该规则的反例吗?