SQL表名,应该用表对应资源对象的复数形式还是单数形式

探讨SQL表名应采用单数还是复数形式,分析单数形式在概念直观性、便利性、优雅性、简单朴素、全球化及拼写效率上的优势。
问题
SQL表名,应该用表对应资源对象的复数形式还是单数形式。例如一个用户表,表名是用user还是users更合适呢?
 

精华回答
 
用单数形式更佳,理由如下:
 
1、概念直观。
你有一个袋子,里面有好多个苹果,你会说这是个苹果袋。但无论里面有0,1,百万个苹果,它依然是个袋子。表也是如此,表明需要描述清楚,表里面包含的对象,而非有多少个数据。
 
2、便利性
单数形式更简单。有一些单词,它的复数形式可能是非常规的,或者就没有复数形式,但是单数不一样,单数形式则没那么多讲究。有些单词的复数,可能会想到你头大,可能得好好google才出来
 
3、优雅
特别是一些master-detail形式的资源名称,统一用单数,读起来更方便,对齐更整齐,从顺序上更有逻辑性。
对比下
单数:
  • Order
  • OrderDetail
复数:
  • OrderDetails
  • Orders
 
4、简单朴素
设想下,不管是表名,主键,关系,实例Classes,你都可以统一用单数,所有看上去那么统一,也不用费心地各种复数单数中转换你的思维
  • Customer
  • Customer.CustomerID
  • CustomerAddress
  • public Class Customer {...}
  • SELECT FROM Customer WHERE CustomerID = 100
一旦你确定,要处理的这个对象,名字定为Customer,那么所有和数据库相关的交互、编程就都将使用这个单词
 
5、全球化
假设你身处一个全球化的团队,成员中有些人,母语不是英文,对他们来说,辨认、书写一个单词的复数形式,要更困难,会给他们带来麻烦,也给团队合作带来麻烦。
 
6、为什么不
这可以节省你的拼写时间,硬盘空间,甚至让你的键盘更“长寿”
  • SELECT Customer.CustomerName FROM Customer WHERE Customer.CustomerID = 100
  • SELECT Customers.CustomerName FROM Customers WHERE Customers.CustomerID = 100
看这两条语句,你可以省下3个字母,3个字节,3次键盘敲击
 
最后,我还认为,你应该给一些容易冲突的名字加个前缀,例如User,要把对应的前缀加上,也就是
User > LoginUser, AppUser, SystemUser, CMSUser,...
 
stackoverflow链接:
http://stackoverflow.com/questions/338156/table-naming-dilemma-singular-vs-plural-names
 
 
专栏介绍:
非常喜欢stackoverflow,总能在上面找到疑难杂症的解决办法。偶然发现该网站有一个热度榜单。于是精选了热度较高的一些问题,然后按照自己的理解,把大家的讨论梳理出来。因此,这些文章不是真正的翻译,而是按照自己的理解做了一些增删、润色,希望能把上面的讨论,更精简有效地分享给大家。
如需转载,请注明原文地址
 

转载于:https://www.cnblogs.com/RyanJin/p/10563070.html

-- ClinicDB 数据库核心实验完整SQL代码(含字段容错方案) -- 说明:若某字段报错,按代码内注释提示替换即可,默认用复数(Doctors/Patients),单数需手动改为Doctor/Patient -- 1. 医生查询:获取医生姓、职称及个人简介 SELECT DoctorName AS 医生姓, Title AS 职称, DoctorIntro AS 个人简介 -- 报错替换方案:PersonalProfile 或 Profile FROM Doctors; -- 报错替换:Doctor(单数) -- 2. 门诊就诊查询:筛选自费就诊记录(含就诊日期、病人编号) SELECT PatientID AS 病人编号, VisitDate AS 就诊日期, PaymentType AS 费用类型 -- 报错替换方案:CostType(最常用替换项) FROM Mz_Visit_Info WHERE PaymentType = '自费'; -- 替换字段时,此处需同步修改(与SELECT保持一致) -- 3. 门诊就诊统计:按病人分组,统计随诊/住院病人的就诊次数 SELECT v.PatientID AS 病人编号, COUNT(VisitID) AS 就诊次数, -- 报错替换方案:COUNT(*)(兼容无VisitID主键的) v.VisitDate AS 就诊日期, v.DisposalMethod AS 处置方式 -- 报错替换方案:Disposal(简化版)或 TreatmentMethod(完整版) FROM Mz_Visit_Info v -- v,简化多关联/分组逻辑 WHERE v.DisposalMethod IN ('随诊', '住院') -- 替换字段时,此处需同步修改 GROUP BY v.PatientID, v.VisitDate, v.DisposalMethod -- 非聚合字段必须包含在GROUP BY中 ORDER BY 就诊次数 DESC; -- 按就诊次数降序排列,优先显示就诊频繁的病人 -- 4. 病人查询:计算病人年龄+统计性别分布(双功能场景) -- 4.1 计算病人年龄(以MySQL语法为例,其他数据库可保留核心逻辑) SELECT PatientName AS 病人姓, Sex AS 性别, -- 报错替换方案:PatientSex(避免与其他Sex字段冲突) TIMESTAMPDIFF(YEAR, BirthDate, CURDATE()) AS 年龄 -- 报错替换方案:BirthDate→PatientBirth FROM Patients; -- 报错替换:Patient(单数) -- 4.2 统计不同性别的病人数量 SELECT Sex AS 性别, -- 替换字段时,此处需与4.1保持一致 COUNT(*) AS 病人数量 FROM Patients GROUP BY Sex;
最新发布
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值