【问题标题】:SQL Design: need ability to add custom "columns" to a table using a fixed schemaSQL 设计:需要能够使用固定模式将自定义“列”添加到表中
【发布时间】:2011-01-22 03:25:09
【问题描述】:

使用:SQL Server 2008、实体框架、WCF 4 REST

我有一个表格来保存监控系统(又名应用程序)生成的测量数据。目前在应用程序中监控着大约 10 种不同的知名数据——每一种都对应于表中的一列。每个客户都可以“自定义”他们的每个应用程序以捕获 1 到 10 条数据——他们只需要捕获他们有兴趣分析的那些信息。使用这种直截了当的固定模式,一切都很好(并且性能很好)。此架构设计为多租户,因此跨多个位置的多个客户的多个应用程序可能会将数据泵入同一个数据库 - 数百万行测量数据(如果我们以前也使用 Azure,我不会感到惊讶长)。

现在有人告诉我,测量应用程序很快就能监控其他“事物”。这个新列表(到目前为止,我被告知大约有 150 个项目)最终可能会测量大约 1000 个项目。最重要的是,用户可以为要监视/测量的项目指定自己的标准(即自定义测量等同于自定义列。)好消息是所有测量数据都是整数。

现在很有趣 - 我如何为这种情况设计架构?我真的很想保持架构固定。考虑到大量数据,我还希望尽可能保持高性能。

感谢任何帮助。

当前架构:

CREATE TABLE MeasurementData (
    DataId bigint IDENTITY(1,1) NOT NULL PRIMARY KEY,
    ApplicationId int NOT NULL,    -- FK to Application table
    DateCollected datetime NOT NULL,
    Length int NULL,
    Width int NULL,
    Height int NULL,
    Color int NULL,
    Shape int NULL,
    Mass int NULL
)
CREATE TABLE Application (
    ApplicationId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    CompanyId int NOT NULL,    -- FK to Company table
    SerialNumber nvarchar(50) NOT NULL
)
CREATE TABLE Company (
    CompanyId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    CompanyName nvarchar(50) NOT NULL
)

然后我们有用户表、角色表等,其中有一个 1-n 关系 btw 公司和用户。

仅供参考,然后网络应用程序将通过表格、图表等呈现数据(通过 REST 网络服务层进行通信)

【问题讨论】:

  • 您将不得不切换到垂直存储数据。这将允许无限量的度量,并且还有助于提高性能,因为您可以将传输的数据减少到仅用户订阅的度量。

标签: sql sql-server database-design azure-sql-database


【解决方案1】:

你能再添加两个表吗?一个是测量类型,另一个是从类型到测量本身的映射?

基本上是一个包含 {DataId, DataMeasurementTypeId, DataValue} 和 {DataMeasurementTypeId, DataMeasurementType} 的表

这应该允许您提供存储过程来检索表中的所有数据测量。

更好的选择可能是使用 Name,Value 表来解决它,并让业务对象层负责构建正确的内容。尽管与 RDBMS 相比,Google 的 BigTable 方法更适合(并且可能执行)更好。

【讨论】:

  • 这是 EAV 可能是唯一可行方法的少数案例之一。
【解决方案2】:

看看这些 SO 示例:onetwothree

【讨论】:

  • 谢谢@Damir,这是 EAV 的变种 - weblogs.sqlteam.com/davidm/articles/12117.aspx 吗?
  • 谢谢@Damir。如果我最终使用观察模式/EAV,并且由于数据都是基于 int 的,那应该会大大简化模式。您如何看待对性能的影响?如果我想在测量数据达到数亿行后获得良好的性能,是否需要构建索引视图和/或数据仓库?
  • @Ed.S -- 好吧,取决于所需的查询。您可能会在某个时候添加一些聚合表(每天、每周......)并对原始测量值表进行分区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 2012-11-30
  • 1970-01-01
  • 2013-08-02
相关资源
最近更新 更多