我想我会 发表于 2015-10-19 11:42

求IT高手乱入

本帖最后由 我想我会 于 2015-10-20 08:49 编辑



问到请删





                                                   

我想我会 发表于 2015-10-19 11:44

这个问题确实太复杂了,所以表达起来也很复杂,都不知道该怎么说才好了,不知道大家能不能看明白,希望有相关经验的高手,一看就能明白我的意思吧,给点指点吧!

抓紧时间 发表于 2015-10-19 11:51

弄个hana估计就不必担心啥了。

真要是讲效率,名堂很多的

shiroki 发表于 2015-10-19 12:23

我觉得楼主这样的线性存储也不行吧,一个大表塞那么多数据,随便做点儿操作不是要慢死。

pattonoriental 发表于 2015-10-19 12:49

输入进库,怎么入都行,关键是你之后用的时候有什么要求?

xiabai84 发表于 2015-10-19 12:59

本帖最后由 xiabai84 于 2015-10-19 14:59 编辑

希望我理解你的问题了。。。 你的目的其实就是想把一个存结构化数据的大表 灌进一个第三范式的数据库里?

我对这种量比较大的数据都基本都是用ETL工具入库(特别你经常读一些什么EXCEL, CSV, XML, TEXT,或者非结构化类型的文件,然后写进数据库)。原因很简单,1 可以节省代码量, 2 保证数据质量(什么空行,主键多次插入,slowly changing dimension各种各样操作), 3 入库效率高。

有可能的话使用集群模式, 多线程读写, 能用bulk load 就优先用, ETL工具里包括各种操作行转列列转行应有尽有。 你的应用不就是应该负责单行数据的增删查改嘛,而不是靠你的应用去搞ETL。。。进表后想优化就是比较大的课题了,这个看你业务逻辑需要, 写高性能的查询语句, 尽量走索引是最基础的优化。。注意数据库的 Optimizer 和 excution plan
建议使用Pentaho 或者Talent, 感觉你的样子像是java 程序员, 这两个东西都是开源的,你上手应该能比较快。1500万行离大数据的等级还差很远。。用classic 的BI手段就能处理。

Java 程序设计不是我的强项,没法给意见。 偶尔自己家里做着玩的话我个人喜欢Netbeans, 懒人首选。。 你在数据库里建好模型,直接对应着生成代码, 随便改改就基本有想要的前端效果了。

楼上的回复老实说我没看懂。。。大概是我low 了。
SAP Hana是内存式的列存储, 是NoSQL的一个分支, 搂主其实就是一个很简单的关系型数据库,而且是CSV 输入。 他好像也没说有什么查询的瓶颈或者非结构化数据建模的困难。 能用开源技术不懂为何用SAP。。。1500万行的效果开元和收费应该没啥区别吧? 最多最多搞个小集群不涉及到大数据技术。

qwycd 发表于 2015-10-19 13:21

你的方法没问题,说你不对的人是想把功能模块化,设计模式嘛。如果源数据是xml的,你的importer没法用了,要从头写。还有就是时间问题,如果一次性的用,一点问题没有,其他类你反正要今后继续用的。

像楼上说的,用talent比较好,不用自己码。1500万行小意思啊!

kudoshinqi 发表于 2015-10-19 13:36

你说的这东西是个factory,查设计模式的factory pattern。 excel数据进入factory, 校验并生成对象,对象再用hibernate之类导入数据库。

区别就是你不能自己写new 关键字来生成对象,因为写错了出来都是错的。工厂类(当然也是你开发的)会先检验再生成对象。同时工厂类里封装好的方法会更便于单元测试

一行一行循环excel当然是可以的,但是不够强壮易读,尤其数据例外或错误多的时候

kudoshinqi 发表于 2015-10-19 13:44

补充一下,lz现在的实现方法最明显的问题是,

如果你运行程序运行了两遍,那么所有数据都会被插入两次,直到sql因为违反数据库constraints失败。插入前不仅要校验数据格式,还要检查是否已经存在。如果数据间有依存关系必须保证一次插入。不过这个应该好的数据接口库就有实现,应该。

我想我会 发表于 2015-10-19 15:39

本帖最后由 我想我会 于 2015-10-20 08:50 编辑

kudoshinqi 发表于 2015-10-19 16:12

你上级和我说的是一个意思,你再仔细看看我写的{:4_279:}

引用:
“3. 本block 没错误, 检测map 看看公司,服务,船,航线,港口 是否已经存在,如果存就从map里取出它,如果不存在就 new 一个新的objekt,。。。”

区别就在这儿,你这个检测map是你的importer的一个对象,new 也是直接写在importer里面的,这样是说你有一个超级controller (就是这个importer), 所有逻辑(无论什么entity)都在里面,这就是面向过程。。。起码不是面向对象。

正确的是,比如要插入block对象,创造对象和检验存在都应该是block类的职责。例如:
static Bool Block.exist(name, date, ...);
static Block Block.createBlockObject() throws InvalidDataException; - 对于block对像,只有这个方法里有new 关键字
void Block.savetoDatabase();

好处是,一旦有新类需要加入,主程序(importer)只需要极小的修改。具体推荐找一些factory pattern的代码读一读,祝你本周能顺利完成这个任务{:4_276:}

kudoshinqi 发表于 2015-10-19 16:15

惯例补充一下,这个提高的是开发和维护效率,运行速度不会提升。并行之类的是其他Thema, 一次性的数据迁移不需要考虑这些。歇晌,下班{:4_279:}

我想我会 发表于 2015-10-19 18:03

kudoshinqi 发表于 2015-10-19 16:12
你上级和我说的是一个意思,你再仔细看看我写的

引用:


谢谢,非常有道理,很可能就是这个意思,我去考虑一下,如何按照这种方式修改一下,谢谢 X 1000!

qwycd 发表于 2015-10-19 21:34

我想总算看明白了你的问题,你是直接在impoter里读cvs数据,直接生成了entity,对不对?你需要在中间加一层BO,来映射entity。

我想我会 发表于 2015-10-19 21:57

qwycd 发表于 2015-10-19 21:34
我想总算看明白了你的问题,你是直接在impoter里读cvs数据,直接生成了entity,对不对?你需要在中间加一层 ...

我就是这个意思,BO 是什么?能详细说说吗?怎么加呢?

qwycd 发表于 2015-10-20 13:11

我想我会 发表于 2015-10-19 21:57
我就是这个意思,BO 是什么?能详细说说吗?怎么加呢?

BO就是business object,可以理解为业务模型,不和数据库有任何联系,但这样做代码量暴增。如果是和系统无关的stammdaten进数据库,我认为你的做法是高效的,并无不可。如果是系统的produktion,因为hibernate一二级缓存同步的原因,非常不建议这么做。

主要看你有多少时间了。

我想我会 发表于 2015-10-20 16:28

本帖最后由 我想我会 于 2015-10-20 16:31 编辑

qwycd 发表于 2015-10-20 13:11
BO就是business object,可以理解为业务模型,不和数据库有任何联系,但这样做代码量暴增。如果是和系统 ...

谢谢,估计说的很可能就是这个模型! 能说说一般BO都是怎么做的吗?

上级说这么个model,我之前没听说过,所以我不知道具体的做法,都给我弄晕了,这个属于那方面知识?

能说说吗?
页: [1]
查看完整版本: 求IT高手乱入