将帐户设置存储在具有复杂数据的单行中

时间:2016-02-26 22:44:06

标签: sql database database-design configuration name-value

我需要存储每个帐户个人资料的帐户设置。我决定使用SQL DB,但不确定我应该使用复杂的数据(json / xml)。

我找到了答案

Using a Single Row configuration table in SQL Server database. Bad idea?

https://softwareengineering.stackexchange.com/questions/163606/configuration-data-single-row-table-vs-name-value-pair-table

但他们都没有讨论使用包含复杂数据的单行方法

复杂数据将存储在以下数据库表

AccountID int
AccountSettings nvarchar(max)

并包含AccountSettings数据,例如

"settings": {
  "branding": {
    "header_color": "1A00C3",
    "page_background_color": "333333",
    "tab_background_color": "3915A2",
    "text_color": "FFFFFF",
    "header_logo_url": "/path/to/header_logo.png",
    "favicon_url": "/path/to/favicon.png",
  },
  "apps": {
    "use":            true,
    "create_private": false,
    "create_public":  true
  },
  "tickets": {
    "comments_public_by_default":     true,
    "list_newest_comments_first":     true,
    "collaboration":                  true,
    "private_attachments":            true,
    "agent_collision":                true
    "list_empty_views":               true,
    "maximum_personal_views_to_list": 12,
    "tagging":                        true,
    "markdown_ticket_comments":       false
  },
  "chat": {
    "maximum_request_count": 5,
    "welcome_message":       "Hello, how may I help you?",
    "enabled":               true
  },
  "voice": {
    "enabled":     true,
    "maintenance": false,
    "logging":     true
  },
  "twitter": {
    "shorten_url": "optional"
  },
  "users": {
    "tagging": true,
    "time_zone_selection": true,
    "language_selection": true
  },
  "billing": {
    "backend": 'internal'
  },
  "brands": {
    "default_brand_id": 47
  },
  "active_features": {
    "on_hold_status":                true,
    "user_tagging":                  true,
    "ticket_tagging":                true,
    "topic_suggestion":              true,
    "voice":                         true,
    "business_hours":                true,
    "facebook_login":                true,
    "google_login":                  true,
    "twitter_login":                 true,
    "forum_analytics":               true,
    "agent_forwarding":              true,
    "chat":                          true,
    "chat_about_my_ticket":          true,
    "customer_satisfaction":         true,
    "csat_reason_code":              true,
    "screencasts":                   true,
    "markdown":                      true,
    "language_detection":            true,
    "bcc_archiving":                 true,
    "allow_ccs":                     true,
    "advanced_analytics":            true,
    "sandbox":                       true,
    "suspended_ticket_notification": true,
    "twitter":                       true,
    "facebook":                      true,
    "feedback_tabs":                 true,
    "dynamic_contents":              true,
    "light_agents":                  true
  },
  "ticket_sharing_partners": [
    "foo@example.com"
  ]
}

其他解决方案是广泛使用的单行方法,如     AccountID int     SettingsName nvarchar(max)     SettingsValue nvarchar(max)

可能包含

等数据
AccountID     SettingsName                   SettingsValue
1             Branding.Header_Color          1A00C3
1             Branding.Page_Background_Color 333333
1             Apps.Use                       true

...

我认为这两种解决方案都是有效的,并且取决于应用程序的需求,但我们真的想知道在使用单行方法存储应用程序设置的复杂数据时是否存在一个问题?

1 个答案:

答案 0 :(得分:0)

一个问题是,如果您拥有繁忙的大型数据库,则无法对XML,text,varchar(max)类型字段执行ONLINE重新索引(如果您有Enterprise版本)。这导致2008 R2的悲痛。较新版本的MS SQL Server可以重新索引在线varchar(max)字段,因此它取决于您运行的版本。

此外,如果您需要搜索特定记录,则无法查询或索引,除非您使用我经常使用的SettingsName,SettingsValue类型的表。这解决了重新索引在线问题(如果这适用于您的情况),以及索引字段以便快速查询。