sskycn
V2EX  ›  数据库

这样的 nql,大家能接受吗?

  •  
  •   sskycn · 22h 26m ago · 2609 views
    nql 1;
    
    query GetUser(id: UserId) {
        from users as u
    
        where u.id == $id
    
        select {
            id:       u.id,
            name:     u.name,
            nickname: u.nickname
        }
    }
    
    query TeamMembers(team: TeamId) {
        from memberships as m
    
        join users as u
            on m.user_id == u.id
    
        where m.team_id == $team
    
        select {
            user_id: u.id,
            name:    u.name,
            role:    m.role
        }
    
        order {
            u.name asc
        }
    }
    
    command CreateUser(
        id: UserId,
        team: TeamId,
        name: Text,
        nickname: Text?
    ) {
        insert users {
            id:       $id,
            team_id:  $team,
            name:     $name,
            nickname: $nickname
        }
    }
    
    command RenameUser(
        id: UserId,
        name: Text
    ) {
        update users
    
        set {
            name = $name
        }
    
        where id == $id
    }
    
    command DeleteUser(id: UserId) {
        delete users
        where id == $id
    }
    
    Supplement 1  ·  20h 13m ago

    这种方式是不是更好?

    表之间的关系不再在查询里体现,让数据库自己处理。

    query UserProfile(user: UserId) {
        users[$user] {
            id
            name
            avatar
    
            team {
                id
                name
            }
    
            posts(
                published == true
                @order created_at desc
                @limit 20
            ) {
                id
                title
                created_at
    
                comments(
                    @order created_at asc
                    @limit 10
                ) {
                    id
                    content
    
                    author {
                        id
                        name
                    }
                }
    
                likes {
                    count
                }
            }
    
            stats {
                followers
                following
                posts
            }
        }
    }
    
    13 replies    2026-09-20 18:12:44 +08:00
    Aruforce
        1
    Aruforce  
       22h 15m ago via Android
    改个编写顺序…也没减少字符…也没看出来动态 sql…对我来说用处不大…不如 mybatis hibernate…
    yangg
        2
    yangg  
       22h 15m ago
    看着不错,
    复杂嵌套的呢?
    sskycn
        3
    sskycn  
    OP
       22h 3m ago
    复杂的查询大概是这样子写:

    query CustomerDetail(customer: CustomerId) {
    from customers as c
    where c.id == $customer

    select {
    id: c.id,
    name: c.name,

    addresses: many {
    from addresses as a
    where a.customer_id == c.id

    select {
    id: a.id,
    city: a.city,
    address: a.address
    }
    },

    orders: many {
    from orders as o
    where o.customer_id == c.id

    select {
    id: o.id,
    created_at: o.created_at,
    total: o.total,

    items: many {
    from order_items as oi

    join products as p
    on p.id == oi.product_id

    where oi.order_id == o.id

    select {
    product: {
    id: p.id,
    name: p.name
    },

    quantity: oi.quantity,
    price: oi.price
    }
    }
    }

    order {
    o.created_at desc
    }

    limit 20
    }
    }
    }
    diudiuu
        4
    diudiuu  
       21h 56m ago
    老哥还在坚持手搓,是之前写 db 的那个吗
    sskycn
        5
    sskycn  
    OP
       21h 47m ago
    @diudiuu 是,现在在给 https://github.com/sskycn/netbadb 设计新的查询语言。

    不兼容 pg,mysql 了,走一条特立独行的路。
    diudiuu
        6
    diudiuu  
       21h 43m ago
    @sskycn #5 先关注了,看着写法理解起来还算简单
    cowcomic
        7
    cowcomic  
       21h 37m ago
    @sskycn 是直接代替 SQL 么,还是给 SQL 包层壳?
    sskycn
        8
    sskycn  
    OP
       21h 33m ago
    不是代替 SQL ,也不是给 SQL 包层壳。

    这是给 NetbaDB 专门设计的一种脚本语言,#1 说的对,还是太复杂了,我还在思考别的方案。
    gopheryi
        9
    gopheryi  
       21h 10m ago
    有 ai 之后真的还需要这些吗,把 skill 写好让 ai 写 ,小众语言感觉会愈来愈少人用
    dacapoday
        10
    dacapoday  
       21h 7m ago
    有没有兴趣谈谈背后的关系模型建模, 比如 schemaless, 全文搜索/向量搜索 与 关系模型 的结合.
    表层的句法在 AI 时代已经没有优化的意义了.
    sskycn
        11
    sskycn  
    OP
       20h 53m ago
    NetbaDB 现在的基本路径是:

    Canonical Schema → typed HIR → Typed Relational IR → Planner → Executor → Storage

    Heap / LSM 是 authoritative storage ;现在的 Columnar 也是作为 derived projection 存在,而不是另一套数据库模型.

    没打算做 schemaless ,而是从用户程序的静态类型定义中生成/推导出来。

    强类型和自适应是这个数据库的目标。
    gefangshuai
        12
    gefangshuai  
       14h 34m ago
    老哥很强,但是现在用 AI 已经不关注这些了。
    rev1si0n
        13
    rev1si0n  
       13h 5m ago
    @gefangshuai 是的,我也觉得在 AI 这个环境下,这些已经没有什么优势了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1124 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 23:18 · PVG 07:18 · LAX 16:18 · JFK 19:18
    ♥ Do have faith in what you're doing.