程序大部分逻辑可以用 sql 来实现,不知道和用代码实现哪种更有效率 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
smdxex
V2EX    程序员

程序大部分逻辑可以用 sql 来实现,不知道和用代码实现哪种更有效率

  •  
  •   smdxex 2017-03-10 17:07:55 +08:00 5001 次点击
    这是一个创建于 3146 天前的主题,其中的信息可能已经有所发展或是发生改变。
    程序大部分逻辑可以用 sql 来实现,不知道和用代码实现哪种更有效率

    比如贪吃蛇大部分核心逻辑

    //初始化形状
    iniSnake(arr) ----->sql "insert arr 9 x=rownumber, y =9 " arr 表添加 9 行,一行代表一个点
    //绘画形状
    drawSnake(arr) ----->sql "select x,y=>drawPoint(x,y) from arr " 绘画形状 drawpoint 需要自己写

    //检查是否有重合点
    CheckSnake(arr) ----->sql "select count (*)> 1 arr a inner join arr j on (a.x=j.x) and (a.y=j.y) " 检查重合点
    33 条回复    2017-03-19 12:00:03 +08:00
    webcoder
        1
    webcoder  
       2017-03-11 02:26:44 +08:00
    所以 linq 出来了
    smdxex
        2
    smdxex  
    OP
       2017-03-11 07:35:56 +08:00 via iPhone
    linq 只用于数据库,这个是绝大多数程序逻辑,都可用用 sql 语法,实现
    wizardforcel
        3
    wizardforcel  
       2017-03-11 12:00:09 +08:00
    LINQ 可以写成链式调用,也可以写成表达式,所以你们觉得哪种更有效率呢?
    msg7086
        4
    msg7086  
       2017-03-11 12:29:31 +08:00
    用 SQL 实现的意思,就是你写一个字符串,然后框架实现一个解析器,分析你的代码,然后转换成原本应该由你来写的代码,再执行。
    msg7086
        5
    msg7086  
       2017-03-11 12:31:15 +08:00
    @wizardforcel LINQ 的两种写法编译出来的结果是相同的,所以运行效率相同。
    至于编写效率,当然跟你熟悉哪种结构有关,你熟悉函数式语句的当然是 Lambda 方便,熟悉 SQL 的当然是 SQL Form 方便咯。
    notreami
        6
    notreami  
       2017-03-11 14:05:20 +08:00
    场景不同,没啥好比较的,折腾个导数据,肯定 sql 快,折腾复杂逻辑,比如多维度,数据库需要几百个表才能实现的,你看那个快?
    notreami
        7
    notreami  
       2017-03-11 14:09:37 +08:00
    几百个张表的,可以类比下, List<List<List<List<List<List<?>>>>>>
    smdxex
        8
    smdxex  
    OP
       2017-03-11 15:08:34 +08:00 via iPhone
    @notreami 网站和 app ,逻辑都简单, sql 可以实现, app 除了界面没有多少业务
    smdxex
        9
    smdxex  
    OP
       2017-03-11 15:09:42 +08:00 via iPhone
    这个 sql ,其实可以代替 orm ,
    mkdong
        10
    mkdong  
       2017-03-11 15:15:40 +08:00
    @smdxex 我记得…… orm 不是用来代替 sql 的么……
    yidinghe
        11
    yidinghe  
       2017-03-11 20:23:47 +08:00 via Android
    有长期项目维护经验的人一般都会把代码尽量挪到容易维护的地方,效率是其次。
    smdxex
        12
    smdxex  
    OP
       2017-03-12 02:26:40 +08:00 via iPhone
    @yidinghe 你不认为 sql 是比任何高级语言,抽象层次更高级吗
    yidinghe
        13
    yidinghe  
       2017-03-12 09:10:22 +08:00 via Android
    @smdxex 语法贴近自然语言不意味着抽象层次就高。 SQL 可维护性差表现在:标准的 SQL 不足以用来开发复杂的逻辑,必需要用到数据库特定的语法,也就是说 SQL 不是一个语言而是一系列语言,学习成本极高。而且这样的业务逻辑就算写出来,将来找谁交接都是个问题,大部分人只会标准 SQL 。
    whatTheGhost
        14
    whatTheGhost  
       2017-03-12 11:18:45 +08:00
    sql 不是图灵完毕的吧
    smdxex
        15
    smdxex  
    OP
       2017-03-12 12:14:56 +08:00 via iPhone
    @whatTheGhost 不完备是没有关系得,这个必须有高级语言代码配合,只不过抽象了一些列逻辑
    smdxex
        16
    smdxex  
    OP
       2017-03-13 12:32:42 +08:00 via iPhone
    高级语言函数调用写在查询内部,比较像 link ,
    按照需求,还应该有并列链式结构,=>不仅有传参数意思,还有顺序结构意思,管道
    smdxex
        17
    smdxex  
    OP
       2017-03-13 12:34:42 +08:00 via iPhone
    linq
    msg7086
        18
    msg7086  
       2017-03-13 23:34:45 +08:00
    @smdxex 你说了半天其实就是在说函数式风格编程咯。这和 SQL 有啥关系。
    smdxex
        19
    smdxex  
    OP
       2017-03-14 04:23:42 +08:00 via iPhone
    @msg7086 很多程序逻辑就是集合操作, sql 抽象了这个集合操作,解析成代码
    msg7086
        20
    msg7086  
       2017-03-14 07:31:41 +08:00
    @smdxex 难道不是函数式风格编程能用来集合操作,而 SQL 只是其中的一种实现吗?
    LINQ 本身就是函数式风格编程, LINQ SQL Form 是函数式编程的 SQL 转写表达。
    msg7086
        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
    smdxex
        22
    smdxex  
    OP
       2017-03-14 08:07:58 +08:00 via iPhone
    @msg7086 现在没有人在逻辑中使用, group , select 等在 c#, java ,等语言中,
    arr.group_by(&:itself).select{ |point, group| group.size > 1 }.keys
    这个是说处理集合得话,我得意思就是这样,但是包括链接查询和所以 sql 可以处理集合
    msg7086
        23
    msg7086  
       2017-03-14 08:17:23 +08:00
    @smdxex 那就……用个好点的语言呗?
    C#的 LINQ 是支持 Group 和 Select 的(分别是 #GroupBy 和#Where ), Java 不懂就不说了。
    所以我之前就说了,你说了半天的 SQL 其实只是函数式风格编程的某种表达,你的关注点应该在函数式风格上,而不是 SQL 上。
    现在我们做开发都已经不写 SQL 语句了,都是用函数式风格来写逻辑,然后交给 ORM 去转译成对应的 SQL 。
    直接写 SQL 其实开发效率是偏低的。
    smdxex
        24
    smdxex  
    OP
       2017-03-14 08:22:36 +08:00
    @msg7086 你没有搞懂我得意思,你一直说得是操作数据库得逻辑,我说得是,一切可以程序逻辑,可以用 sql 类似语句
    来表达,比如,我弄了好几个游戏,发现这些游戏 6-7 成逻辑,可以写成 sql 语句来表达, sql 抽象度更高,所以效率更高
    msg7086
        25
    msg7086  
       2017-03-14 08:29:24 +08:00
    @smdxex 是你没有搞懂我的意思。
    我上面根本就没有提到任何一个数据库,示例的操作全都是在数组上进行的。
    你如果把你那些 SQL 语句都写成函数式表达,你会发现不仅抽象度好,而且表达力更强,开发效率比 SQL 更高。

    SQL 的表达力已经很弱了,所以 Rails 框架才把 SQL 抽象起来,更好地用代码来表达。
    而你现在等于是在开倒车,倒退回用 SQL 的年代。
    smdxex
        26
    smdxex  
    OP
       2017-03-14 08:50:38 +08:00 via iPhone
    @msg7086 我得意思是,这种 sql ,可以代替
    90%循环,但是我从来没有听说过,不写循环得程序
    msg7086
        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= } }

    如果你没听说过,那就去听说一下呗……
    msg7086
        28
    msg7086  
       2017-03-14 08:53:27 +08:00
    上面代码手滑了,两处应该是 >= 5 。
    smdxex
        29
    smdxex  
    OP
       2017-03-16 08:28:57 +08:00
    @msg7086 以前你们根本没有发现, sql 这种表达方式,可以写游戏,写 app,写企业应用关系少得,本地应用,
    msg7086
        30
    msg7086  
       2017-03-17 09:51:32 +08:00
    @smdxex 哦嚯,你是全球第一个发现的啊,好棒哦。

    反正我们早就淘汰这种低效率的表达方式了,你开心就好。
    smdxex
        31
    smdxex  
    OP
       2017-03-17 11:21:20 +08:00 via iPhone
    @msg7086 是你开心,聊以自慰就好吧
    smdxex
        32
    smdxex  
    OP
       2017-03-17 11:23:11 +08:00 via iPhone
    我说得这个东西,其实是微软很早前提出得, dsl 语言得,改进版本,换了一个表达方式,你们就自慰起来了?
    beetlerx
        33
    beetlerx  
       2017-03-19 12:00:03 +08:00
    你要是搞着玩,随便怎么方便怎么来,要是分布式应用,一般把逻辑放在代码里,就是尽量把压力放在应用端而不是数据库端,因为一般应用横向扩容比数据库扩容简单的多,出现问题了直接大不了重启,数据库要是挂了就不好玩了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1236 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 17:32 PVG 01:32 LAX 10:32 JFK 13:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86