BDu*_*elz 22 mysql sql database-design
我编写的很多应用程序都使用了查找表,因为这就是我教授的方式(规范化等).问题是由于这个原因,我所做的查询通常更复杂.它们通常看起来像这样
获取所有仍处于打开状态的帖子
"SELECT * FROM posts WHERE status_id = (SELECT id FROM statuses WHERE name = 'open')"
Run Code Online (Sandbox Code Playgroud)
通常,查找表本身非常短.例如,可能只有3种左右的不同状态.在这种情况下,是否可以通过在应用程序中使用常量来搜索某种类型?就像是
获取所有仍处于打开状态的帖子
"SELECT * FROM posts WHERE status_id = ".Status::OPEN
Run Code Online (Sandbox Code Playgroud)
或者,如果不是使用外来ID,我将其设置为枚举并查询它?
谢谢.
Per*_*DBA 31
如果您仅限于MyNonSQL中的小型文件系统,或者您正在考虑SQL和大型数据库,那么答案有所不同.
在真正的数据库中,有许多应用程序使用一个数据库,许多用户使用不同的报告工具(不仅仅是应用程序)来访问数据,标准,规范化和开放式体系结构要求非常重要.
尽管有人试图改变"正常化"等的定义以适应目的,但规范化并没有改变.
如果在数据表中重复"打开"和"关闭",则这是一个简单的标准化错误.如果更改这些值,则可能需要更新数百万行,这是非常有限的设计.这些值通常归一化为Reference或Lookup表.它还节省了空间."打开","关闭"等值不再重复.
第二点是易于更改,如果"已关闭"更改为"已过期",则需要更改一行,这将反映在整个数据库中; 而在非标准化文件中,需要更改数百万行.
添加新值只需插入一行即可.
在Open Architecture术语中,Lookup表是一个普通的表.它存在于(标准SQL)目录中; 任何报表工具都可以找到它,只要定义了PK :: FK关系,报表工具也可以找到它.
枚举仅适用于非SQLS.在SQL中,Enum是一个Lookup表.
下一点涉及密钥的意义.如果密钥对用户毫无意义,那么使用INT或TINYINT或任何合适的东西; 逐渐编号; 允许"差距".但是如果密钥对用户有意义,请不要使用无意义的数字,请使用有意义的密钥.男女"M"和"F"等
如果您确实使用了有意义的密钥,请使用简短的字母代码,用户和开发人员都可以轻松理解(并从中推断出长篇描述).
由于PK是稳定的,特别是在查找表中,您可以安全地编码:
WHERE status_id = 'O'
您不必加入Lookup表并检查值"Open".这会丢失代码段中Lookup表的值.
SQL是一种繁琐的语言,尤其是在连接时.但这就是我们所拥有的,所以我们需要接受障碍并处理它.你的示例代码很好.但更简单的形式可以做同样的事情.报告工具将生成:
Run Code Online (Sandbox Code Playgroud)SELECT p.*,
s.name
FROM posts p,
status s
WHERE p.status_id = s.status_id
AND p.status_id = 'O'
For banking systems, where we use short codes which are meaningful (since they are meaningful, we do not change them with the seasons, we just add to them), given a Lookup table such as (carefully chosen, similar to ISO Country Codes):
Run Code Online (Sandbox Code Playgroud)
Eq Equity
EqCS Equity/Common Share
O Over The Counter
OF OTC/Future
Code such as this is common:
WHERE InstrumentTypeCode LIKE "Eq%"
并且用户将从显示"打开","已关闭"等的下拉列表中选择值,而不是{0,1,2,4,5,6},而不是{M,F,U}.在应用程序和报表工具中都有.如果没有查找表,则无法执行此操作.
最后,如果数据库很大,并支持BI或DSS或OLAP函数(高度规范化的数据库),那么Lookup表实际上是Dimension-Fact分析中的Dimension或Vector.如果不存在,那么在安装此类分析之前,必须添加它以满足该软件的要求.
归档时间: |
|
查看次数: |
22223 次 |
最近记录: |