贾斯汀·凯夫(Justin Cave)正确地认为这会导致冗余数据,但这实际上取决于您如何设计数据库。
将整个对象序列化为Blob的方法并不像大多数人认为的那样令人毛骨悚然。实际上,对于某些应用程序,这可能是您可以做的最好的设计,正如我在此处解释的那样:https : //stackoverflow.com/a/12644223/1121352。
实际上,序列化对象至少会带来两个好处:
1- 减少阻抗不匹配:某些Java类型在SQL中是不可用的,特别是如果您使用大量的类和自定义类型,则从Java对象到SQL的来回转换可能会很麻烦,甚至会导致歧义。
2- 模式的灵活性更高。确实,关系模式对于共享相同结构的数据确实非常有用,但是如果一个类中的某些对象根据运行时的条件而具有不同的属性,则关系模式会极大地阻碍您的工作流程。
因此,这种方法肯定有好处(至少有这两种,但我肯定没有提到其他优点),但是当然要付出的巨大代价是您几乎失去了所有关系模式的好处。
但是,如果您精心设计数据库,则可以兼得两全:您仍然可以通过使用每个对象唯一的属性来设置关系模式(即,唯一键列),然后将该对象存储在Blob中。这样,您仍然可以在给定由对象属性定义的唯一标识符的情况下,确保快速检索对象,同时减少冗余,同时消除阻抗不匹配并保持Java对象的完全灵活性。
附带说明一下,一些数据库制造商曾尝试将关系模型和对象模型混合在一起,例如PostSQL和PostgreSQL中的JSON数据类型,以便您可以像处理任何关系列一样直接处理JSON,以及SQL3和OQL(对象查询语言)以向SQL添加(有限)对象支持。
最后,这都是设计问题,关系模型和对象模型之间必须折衷。
阅读注释后的/ EDIT:当然,如果您的数据必须可搜索(“可查询”),则不应将数据存储为Blob。但是,如果您的数据的某些部分不是可搜索的,而是某种元数据,那么将该数据部分作为对象存储在Blob中可能是一个很好的解决方案,尤其是如果该元数据具有灵活的结构并且可以随对象而变化。