1
webcoder 2017-03-11 02:26:44 +08:00
所以 linq 出来了
|
2
smdxex OP linq 只用于数据库,这个是绝大多数程序逻辑,都可用用 sql 语法,实现
|
3
wizardforcel 2017-03-11 12:00:09 +08:00
LINQ 可以写成链式调用,也可以写成表达式,所以你们觉得哪种更有效率呢?
|
4
msg7086 2017-03-11 12:29:31 +08:00
用 SQL 实现的意思,就是你写一个字符串,然后框架实现一个解析器,分析你的代码,然后转换成原本应该由你来写的代码,再执行。
|
5
msg7086 2017-03-11 12:31:15 +08:00
@wizardforcel LINQ 的两种写法编译出来的结果是相同的,所以运行效率相同。
至于编写效率,当然跟你熟悉哪种结构有关,你熟悉函数式语句的当然是 Lambda 方便,熟悉 SQL 的当然是 SQL Form 方便咯。 |
6
notreami 2017-03-11 14:05:20 +08:00
场景不同,没啥好比较的,折腾个导数据,肯定 sql 快,折腾复杂逻辑,比如多维度,数据库需要几百个表才能实现的,你看那个快?
|
7
notreami 2017-03-11 14:09:37 +08:00
几百个张表的,可以类比下, List<List<List<List<List<List<?>>>>>>
|
8
smdxex OP @notreami 网站和 app ,逻辑都简单, sql 可以实现, app 除了界面没有多少业务
|
9
smdxex OP 这个 sql ,其实可以代替 orm ,
|
11
yidinghe 2017-03-11 20:23:47 +08:00 via Android
有长期项目维护经验的人一般都会把代码尽量挪到容易维护的地方,效率是其次。
|
13
yidinghe 2017-03-12 09:10:22 +08:00 via Android
@smdxex 语法贴近自然语言不意味着抽象层次就高。 SQL 可维护性差表现在:标准的 SQL 不足以用来开发复杂的逻辑,必需要用到数据库特定的语法,也就是说 SQL 不是一个语言而是一系列语言,学习成本极高。而且这样的业务逻辑就算写出来,将来找谁交接都是个问题,大部分人只会标准 SQL 。
|
14
whatTheGhost 2017-03-12 11:18:45 +08:00
sql 不是图灵完毕的吧
|
15
smdxex OP @whatTheGhost 不完备是没有关系得,这个必须有高级语言代码配合,只不过抽象了一些列逻辑
|
16
smdxex OP 高级语言函数调用写在查询内部,比较像 link ,
按照需求,还应该有并列链式结构,=>不仅有传参数意思,还有顺序结构意思,管道 |
17
smdxex OP linq
|
20
msg7086 2017-03-14 07:31:41 +08:00
@smdxex 难道不是函数式风格编程能用来集合操作,而 SQL 只是其中的一种实现吗?
LINQ 本身就是函数式风格编程, LINQ SQL Form 是函数式编程的 SQL 转写表达。 |
21
msg7086 2017-03-14 07:44:13 +08:00
以下是你那些 SQL 代码的 Ruby 函数式风格转写:
INSERT arr 9 x = rownumber, y = 9 9.times { |x| arr << {x: x, y: 9} } SELECT x,y=>drawPoint(x,y) FROM arr arr.each { |x:, y:| draw_point(x, y) } SELECT count (*) > 1 arr a INNER JOIN arr j ON (a.x=j.x) AND (a.y=j.y) arr.group_by(&:itself).select{ |point, group| group.size > 1 }.keys |
22
smdxex OP @msg7086 现在没有人在逻辑中使用, group , select 等在 c#, java ,等语言中,
arr.group_by(&:itself).select{ |point, group| group.size > 1 }.keys 这个是说处理集合得话,我得意思就是这样,但是包括链接查询和所以 sql 可以处理集合 |
23
msg7086 2017-03-14 08:17:23 +08:00
@smdxex 那就……用个好点的语言呗?
C#的 LINQ 是支持 Group 和 Select 的(分别是 #GroupBy 和#Where ), Java 不懂就不说了。 所以我之前就说了,你说了半天的 SQL 其实只是函数式风格编程的某种表达,你的关注点应该在函数式风格上,而不是 SQL 上。 现在我们做开发都已经不写 SQL 语句了,都是用函数式风格来写逻辑,然后交给 ORM 去转译成对应的 SQL 。 直接写 SQL 其实开发效率是偏低的。 |
24
smdxex OP @msg7086 你没有搞懂我得意思,你一直说得是操作数据库得逻辑,我说得是,一切可以程序逻辑,可以用 sql 类似语句
来表达,比如,我弄了好几个游戏,发现这些游戏 6-7 成逻辑,可以写成 sql 语句来表达, sql 抽象度更高,所以效率更高 |
25
msg7086 2017-03-14 08:29:24 +08:00
@smdxex 是你没有搞懂我的意思。
我上面根本就没有提到任何一个数据库,示例的操作全都是在数组上进行的。 你如果把你那些 SQL 语句都写成函数式表达,你会发现不仅抽象度好,而且表达力更强,开发效率比 SQL 更高。 SQL 的表达力已经很弱了,所以 Rails 框架才把 SQL 抽象起来,更好地用代码来表达。 而你现在等于是在开倒车,倒退回用 SQL 的年代。 |
26
smdxex OP @msg7086 我得意思是,这种 sql ,可以代替
90%循环,但是我从来没有听说过,不写循环得程序 |
27
msg7086 2017-03-14 08:52:28 +08:00
@smdxex
再举个栗子好了,假设有如下的本地变量和类型: Gamedata = {Mob, Persons} Person = {HP, MP, Money, Bag} Bag = [Items] Item = [Name, Count] 现在要找出所有身上带着至少 5 个大师球的所有玩家。 你眼中别的程序员的代码: MatchedPersons = [] for i = 1 to Gamedata.Persons.size ..person = Gamedata.Persons[i] ..items = person.Bag ..count = 0 ..for j = 1 to items.size ....item = items[j] ....if item.Name == '大师球' ......count = item.Count ..if count >= 5 ....MatchedPersons += person 你眼中的代码: SELECT DISTINCT Persons FROM Gamedata.Persons JOIN Items WHERE Persons.id = Items.person_id AND Item.Name = '大师球' AND Item.Count > 5 别人眼中的代码: Gamedata.Persons.select { |p| p.Bag.any? { |i| i.name == '大师球' && i.count > 5= } } 如果你没听说过,那就去听说一下呗…… |
28
msg7086 2017-03-14 08:53:27 +08:00
上面代码手滑了,两处应该是 >= 5 。
|
32
smdxex OP 我说得这个东西,其实是微软很早前提出得, dsl 语言得,改进版本,换了一个表达方式,你们就自慰起来了?
|
33
beetlerx 2017-03-19 12:00:03 +08:00
你要是搞着玩,随便怎么方便怎么来,要是分布式应用,一般把逻辑放在代码里,就是尽量把压力放在应用端而不是数据库端,因为一般应用横向扩容比数据库扩容简单的多,出现问题了直接大不了重启,数据库要是挂了就不好玩了
|