1

我有许多不同的消息类型(比如说 20 种),我需要根据它们的日期和类型以下列方式选择它们

IE... WHERE date BETWEEN [fromDate] AND [toDate] AND type = [0 - 20 different types]

不同类型的消息很少有共同的列(日期是最重要的),但我总是需要“一口气”获取各种评论,按日期排序。消息具有自引用以允许线程对话。消息将始终是一种类型,并且只有一种类型。

因为我在存档中有 5.000.000 条消息,而会话中很少超过 50 条消息,所以我需要能够按日期或会话标识符有效地选择。因此,我有一个“所有消息之母”表和多个1 .. 0-1与消息表有关系的额外表:

messages:   [id, date, parent_id (nullable), ... ]
msgs_type1: [col1, col2, col3, col4, ...]
msgs_type2: [col1, col2, col3, col4, ...]

然后这是我的问题: 您通常如何指定这些类型的表之间的关系?以例如以下方式加入表格有什么(缺点)优点:

messages: [id, date, parent_id (null), **msg_type_1 (null), msg_type_2 (null)**, ...]
msgs_type1: [col1, col2, col3, col4]
msgs_type2: [col1, col2, col3, col4]
...

(消息中指定的可选关系)

messages: [id, date, **type**, parent_id (null)]
msgs_type1: [**message_id**, col1, col2, col3, col4]
msgs_type2: [**message_id**, col1, col2, col3, col4]
...

(msgs_type 表中指定的强制关系,message 中指定的查找表)

一方面,拥有 20 个可选列感觉很脏,其中(仅)一列必须具有值才能指定消息的类型。

另一方面,改为使用“类型”枚举列,并使用它来手动推断要在哪个表中查找附加信息也感觉不对 - 并且可能会在大多数 ORM 中造成很大的痛苦。

那么这本书对这些类型的结构有什么看法呢?我有 200 条不同类型的消息的那一天呢?

4

1 回答 1

2

恕我直言:任何时候你都必须改变你的数据库,因为你已经添加了一个新的“类型”“某物”,正如他们所说,你做错了。我唯一对这种面向列的表感到满意的情况是,如果它是在生成报告之前完成的。或者,也许,在流程结束时完成,以减轻可能想要生成自己的查询的非技术用户的工作。

具有 5 到 1000 万行的正确索引和规范化的表结构应该仍然可以正常运行。

于 2012-05-04T18:16:04.363 回答