我正在设计一个实验室数据库。一些产品,样品等由复合数字识别,其中多个部分表示不同的值,例如:原产地,日期,类型,今天的ID等。复合数字的示例可能包括驾驶执照号码(X44-555-3434) ,批号(XBR-A26-500-2)。
如何将复合数存储在数据库中?它们应该存储为字符串还是应该单独存储(或导出)复合数字的每个组成部分?
注意:如果一般无法回答问题,请使用Oracle。
答案 0 :(得分:8)
根据我的经验,如果字符串的元素有意义,最好将它们放在自己的字段中。我们试图梳理出意义的体操是复杂且容易出错的;当我们明确处理每个字段时,也更容易进行数据验证。构造复合字符串很容易,很容易在构造的字符串上搜索(虽然有时很难索引)。细粒度存储对我来说一直都是最好的。
答案 1 :(得分:3)
这取决于您最终想要查询的内容。如果要分别查找字符串的某些部分,请单独保存。如果你想查找整个代码(有或没有破折号,可以处理),请将其存储为单个字符串。
答案 2 :(得分:1)
此外,如果您决定将它们存储在不同的列中,最好从中创建一个唯一键(包含所有列的唯一键)。
答案 3 :(得分:1)
我将分别存储复合数字的每个编码片段,可能作为代码要表示的实际值(即,不是将“XBR”存储“2007年1月12日”存储为时间戳)。但这取决于您是希望更频繁地按编码复合数字查找项目,还是根据实际语义来查找项目。
然后我会在数据库中的某处保持代码和实际值之间的映射。所以我有一些小表,每个表存储两列,一个代表代码,一个代表例如时间戳。
答案 4 :(得分:1)
这些数字的推导是否可能会发生变化以及预期会如何影响应用程序?
例如,多年前,英国的汽车登记牌开始时有三个字母(我认为是一个区域),后面跟着三个数字,然后是另一个字母,表示注册年份。
最终他们用完了后缀的字母,然后转了订单,而不是“ABC 123 A”,你可能有“A 123 ABC”,而且可能有两辆车在同时,一个是“ABC 123 A”,另一个是“A 123 ABC”。 哦,然后他们加快了单字母年份指标的使用(因为很多人都在等到新信在购买汽车之前生效),所以它不再表示一年了。
如果您只对登记牌感兴趣,那么您最好将登记牌存放为一个值。但是,负责发布号码的应用程序可能需要将它们分解为组件。