不同表上具有相同名称的列可以具有不同的数据类型吗?

时间:2019-04-03 10:01:00

标签: sql database oracle database-design

我正在寻找一些指导。查看我们的数据库之一,我们发现所有的列都被命名为相同的列,例如X。现在,列X出现在同一数据库的多个表中。但是,在10列中,数字/ varchar数据类型几乎是均匀划分的。

我想知道这是否可以,还是我应该尝试提出一些建议来对此进行更改?从我可以看到的现实数据都是数字。

非常感谢您提前提供帮助。

2 个答案:

答案 0 :(得分:3)

这实际上取决于列X是十个不同表上的相同业​​务属性,还是具有相同列名的不同属性。

  

我想知道是不是...

如果这些列代表不同的业务属性,那么它们共享相同的名称是很可恶的,但是可能没有足够的破坏来证明重命名它们的合理性。它取决于真实姓名(假设它不是真的X)。

如果每个列表示相同的业务属性,则对于它们具有不同的数据类型绝对是不可行的。可能发生的最好情况是您的连接效率低下,因为Oracle必须将字符列转换为数字值。在最坏的情况下,您已经打开了破坏数据的门户,现在只应包含数字值的列现在包含非数字值,这些数字不能转换,并且会导致查询失败。历史的教训是这种数据损坏最终会发生。

  

...或者我应该尝试提出一些改变的东西

在理想世界中,您应该更改此设置。当然,在理想的世界中,您不必:-)

实用性是,拥有一致的物理数据模型总是一件好事,但是您可能很难说服人们这样做的价值。

至少需要付出很多努力,因为您不能简单地通过ALTER TABLE…MODIFY来更改已填充列的数据类型。您需要添加一个新列,将数据跨接,删除旧列,重命名新列,然后重新应用任何约束,索引等。然后是使用所涉及表的应用程序的回归测试。

那是一条快乐的路:如果发现数据损坏已发生并且这些列中包含非数字数据,会发生什么?现在变得非常混乱。

答案 1 :(得分:0)

从我的角度来看,X可以,但是我更喜欢将它们命名为X_THISX_THAT,因为-尽管最佳实践表示您应该始终当查询看起来像

时,在列名前加上表格(别名)
select a.x, b.x, c.x
from emp a join dept b on a.deptno = b.deptno
join job c on c.job = a.job

很难(一见钟情)发生了什么。但是,如果有

select a.x_emp, b.x_dept, c.x_job
from emp a join dept b on a.deptno = b.deptno
join job c on c.job = a.job

然后,由于不必为列名创建别名,因此您的生活会更轻松。