我们有许多来自网络服务的项目;每个项目包含未知数量的属性。我们将它们存储在具有以下Schema的数据库中。
产品
- ItemID
- ItemName
属性
- PropertyID
- 财产名称
- PropertyValue
- PropertyValueType
- TransmitTime
- ItemID [fk]
属性表变得非常大,因为每次调用Web服务时它都会存储每个项的属性。我的问题是:我们应该在什么时候停止向Properties表添加新记录,并根据它们的传输时间归档旧的Property记录?属性表什么时候变得太大,查询时间太长?有经验法则吗?
感谢。
答案 0 :(得分:2)
我不确定MS SQL Server,但大多数数据库似乎都有分区表的方法。也就是说,从许多较小的表中创建一个虚拟表,并根据一些简单的规则在它们之间划分数据。
这对于基于时间的数据非常有用。将表格划分为一天或一小时的时间段。然后每个时间段添加一个新的表分区并删除最旧的表分区。比执行DELETE WHERE时间<更高效。现在 - '1小时',或其他什么。
或者不是删除最旧的,而是将其归档或者只是让它占用空间。只要您的查询始终指定日期范围,查询就只能使用最合适的子表。
答案 1 :(得分:2)
没有经验法则
一些想法:
答案 2 :(得分:1)
我认为这不是一个黄金法则。虽然规范化可能会导致性能显着下降,但您的架构已经很规范化了。
需要考虑的几个因素:
- 使用场景
- 服务器硬件规格
- 数据库操作的性质(例如,读取比写入更多?,插入和不更新?)
对于您的情况,如果属性数量不超过某个数字,则单个锯齿状表可能更好或者可能不是。 (我可能会因为这句话而受到抨击:P)
归档策略还取决于您的业务需求/要求。您可能需要为了满足这种需要而抽空硬件。
答案 3 :(得分:0)
根据您拥有的特定“属性类型”的数量,观察模式可能会有所帮助。
在你的例子中:
Item = Subject
,
Property = Observation
,
PropertyName = ObservationType.Name
,
PropertyValueType = ObservationType.IsTrait
这样,您就不会在每条记录中重复PropertyName
和PropertyValueType
。根据您的应用程序,如果您可以在应用层中缓存ObservationType
和Subject
,那么插入也会得到改善。
- 测量和特征是类型
观察结果。测量是一个
数字观察,像高度。
特质是描述性的观察,
喜欢颜色。