通过用NUMBER_VALUE,DATE_VALUE,STRING_VALUE替换VALUE来避免字符串类型的数据.这三种类型在大部分时间都很好.
如果需要,您可以稍后再添加XMLTYPE和其他花哨的列.而对于Oracle,使用VARCHAR2而不是CHAR来节省空间.
始终尝试将值存储为正确的类型.本地数据类型更快,更小,更易于使用,更安全.
Oracle具有通用数据类型系统(ANYTYPE,ANYDATA和ANYDATASET),但是这些类型很难使用,在大多数情况下应该避免.
建筑师通常认为对所有数据使用单个字段使事情变得更容易.它使得更容易生成数据模型的漂亮图片,但它使所有的东西
否则更难.考虑这些问题:
>您不能在不知道类型的情况下对数据进行任何有趣的事情.即使显示数据,知道类型来证明文本是有用的.在99.9%
使用情况对用户来说显而易见,3列中的哪一列是相关的.
>针对字符串类型的数据开发类型安全的查询是痛苦的.例如,假设你想为在这个千年出生的人找到“出生日期”:
select *
from ReportFieldValue
join ReportField
on ReportFieldValue.ReportFieldid = ReportField.id
where ReportField.name = 'Date of Birth'
and to_date(value, 'YYYY-MM-DD') > date '2000-01-01'
你能发现这个bug吗?上述查询是危险的,即使您以正确的格式存储日期,很少有开发人员知道如何正确地修复它. Oracle具有优化,难以强制执行特定的操作顺序.您需要这样的查询才能安全:
select *
from
(
select ReportFieldValue.*, ReportField.*
--ROWNUM ensures type safe by preventing view merging and predicate pushing.
,rownum
from ReportFieldValue
join ReportField
on ReportFieldValue.ReportFieldid = ReportField.id
where ReportField.name = 'Date of Birth'
)
where to_date(value, 'YYYY-MM-DD') > date '2000-01-01';
你不想让每个开发人员以这种方式写出他们的查询.