我有一类具有大量二进制属性的数据 - 确切地说是151(!) - 我关心的是如何在结构上建模这些数据。尽管存储位字节作为字节的内部效率,我的编程蜘蛛侠感觉在创建一个包含151个字段的表(除了其他属性之外)时感到刺痛。
不会有大量行 - 可能是1000行,一旦投入生产,就不会经常变化。
我曾想过将我的数据分类为不相交的子类并创建单独的表,但是以这种方式拆分属性是不切实际的,即使可能,也肯定不能有效地映射数据子类。另一个问题是我想将所有数据保存在一起并避免字段和/或行重复。我还考虑过使用一些自定义二进制格式,但这不可行,因为我的数据中的关键字段在其他表中用作外键。
查询将大量使用WHERE子句来提取相关数据。我已经考虑过使用多个long或int字段,但是我拒绝这是不可行的,因为我知道SQL中没有按位和运算符或函数,如上所述,属性的分类是有问题的,更不用说其他主要的软件工程问题(用这种方法)。
我将使用PostgreSQL。
所以,我的问题是,我只是制作一个包含大量字段的表,还是有其他与关系模型兼容的方法?
答案 0 :(得分:2)
我看到的最大问题是明显的事实,即单场索引的基数至少可以说是低。也许您可以更多地描述数据,我们可以讨论其他设计?例如,所有这些都是彼此独立的吗?
只有1000行,将其存储在数据库以外的地方可能更简单(虽然我想有很多连接机会?)不是出于查询效率的原因,但它看起来并不像数据库数据。
答案 1 :(得分:1)
为什么不能使用位智能运算符?
& bitwise AND 91 & 15 11
| bitwise OR 32 | 3 35
# bitwise XOR 17 # 5 20
~ bitwise NOT ~1 -2
来自:http://www.postgresql.org/docs/7.4/static/functions-math.html
我认为你可以将它们分成小组,但除此之外我不知道另一种方式。
答案 2 :(得分:1)
答案 3 :(得分:1)
为最适合您的问题域的数据建模。在这种情况下,您没有太多数据,在最坏的情况下,假设每行占用200个字节,您正在查看少于200 Kb的数据。即使您的特定数据库没有以有效的方式实现布尔属性,这也是一个微不足道的数量。
另一方面,拥有150个布尔属性听起来有点可疑,也许您的数据模型可以进一步规范化?