主流的关系型数据库,比如MySQL,只能支持到表级别的鉴权。也就是说,一个用户如果被授权访问一张表,那么他就能访问这张表里的所有数据。但是现实中的业务逻辑,通常不希望用户可以访问表里的所有数据。比如查询用户信息的表,通常后端需要写SELECT……FROMusersWHEREuser_id=xxx;这里的WHERE语句相当于一层权限管理,确保一个用户只能访问他自己的信息。如果前端直接操纵数据库,就意味着用户可以篡改一些信息,来查询到他们本不应该能查询到的信息。比如把上述WHERE语句中的user_id替换成其他用户的ID,就可以查询到其他用户的信息。这一点从数据库的权限管理机制上来说是无法限制的。
能不能调数据库,跟语言没关系,跟运行环境有关系。你说的js应该是前端js脚本,在浏览器中运行,写页面特效的,这要是能调数据库,相当于每个用户都能直连数据库,这像话吗?即使你把脚本语言换成java、c++、vb,那也不能干这事。
当然,js在写后端的时候就能调数据库,nodejs就是干这事的,它直接运行在服务器上,调数据库没问题。
之所以不能直接对接到数据库,要中间服务代理一下(graphql也需要“代理”),主要有几个原因:
安全问题:直接暴露数据库连接地址、连接token(不管是密码账号还是中间token),都可能导致数据库被拖库,容易被爆破、篡改
性能问题:数据库SQL的优化很复杂,不是看到的简单select语句、CRUD,分库分表、索引优化都难以在前端实现,即使GraphQL,也需要db的中间层
简单科普一下,MySQL,Postgres这种经典数据库,本身也是分成数据库服务器和客户端两部分的,本地命令行连接数据库也需要安装mysql-client或是pq_ctl这种客户端,然后通过本地的socket或者tcp协议连接数据库服务。
因为浏览器一般只向js提供