【发布时间】:2014-04-15 14:07:37
【问题描述】:
我正在开发一个应用程序,该应用程序需要用户在联系人表上定义自定义字段。此联系人表可以包含数百万个联系人。
我们正在考虑使用存储有关字段信息的二级元数据表,以及存储实际数据的三级值表。
这是粗略的架构:
CREATE TABLE [dbo].[Contact](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](max) NULL,
[MiddleName] [nvarchar](max) NULL,
[LastName] [nvarchar](max) NULL,
[Email] [nvarchar](max) NULL
)
CREATE TABLE [dbo].[CustomField](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FieldName] [nvarchar](50) NULL,
[Type] [varchar](50) NULL
)
CREATE TABLE [dbo].[ContactAndCustomField](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ContactID] [int] NULL,
[FieldID] [int] NULL,
[FieldValue] [nvarchar](max) NULL
)
但是,这种方法会带来很多复杂性,尤其是在导入具有多个自定义字段的 CSV 文件时。目前,这需要为每个单独的自定义字段提供更新/加入语句和单独的插入语句。连接也需要一次返回多行的自定义字段数据
我主张采用这种结构:
CREATE TABLE [dbo].[Contact](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](max) NULL,
[MiddleName] [nvarchar](max) NULL,
[LastName] [nvarchar](max) NULL,
[Email] [nvarchar](max) NULL
[CustomField1] [nvarchar](max) NULL
[CustomField2] [nvarchar](max) NULL
[CustomField3] [nvarchar](max) NULL /* etc, adding lots of empty fields */
)
CREATE TABLE [dbo].[ContactCustomField](
[ID] [int] IDENTITY(1,1) NOT NULL,
[FieldIndex] [int] NULL,
[FieldName] [nvarchar](50) NULL,
[Type] [varchar](50) NULL
)
第二种方法的缺点是创建联系人表时必须指定有限数量的自定义字段。我不认为这是一个主要障碍,因为它在导入大型 CSV 文件和返回结果集时肯定会带来性能优势。
对于大量行,哪种方法最有效?第二种技术有什么我没有看到的缺点吗?
【问题讨论】:
-
sparse columns 不正是您所需要的吗?
-
您当前的示例几乎是 EAV 实现。
-
谢谢米海。是的,它是一个 EAV 实现,虽然直到现在我还不知道它的正确名称。
标签: sql sql-server database performance custom-fields