2

我想创建一个包含动态数据的表,它可以是日期、布尔值或文本文章的形式

例如:

meta_key = "isActive" meta_value = "1"

或者

meta_key = "theDate" meta_value = "2005 年 7 月 23 日星期六 02:16:57"

或者

meta_key = "description" meta_value = "这是一个描述,这个文本可以继续,所以我需要一个长字段"

问题是 meta_value 应该是什么类型的字段,以便不会为每个插入的“1”使数据库膨胀太多,哪些字段是动态的,只会消耗它们自己长度的空间

希望我很清楚...

4

5 回答 5

1

如果您要存储非结构化数据或文档(例如friendfeed),我只会使用非结构化数据模型,就像您建议的那样。

替代存储想法

对于非结构化数据,有许多比 SQL Server 更合适的数据存储系统。我建议将其中之一与您现有的结构化数据库结合起来。

SQL 选项

如果您无法做到这一点并且必须在 SQL DB 中存储非结构化数据,那么您有几个选择,数据类型并不是真正唯一关心的问题,您的数据是如何存储的。

  • 一些结构允许读取数据的应用程序能够轻松解析数据,而无需复杂的字符串操作函数。

  • 能够为应用程序中的数据定义模型,因此当您读取数据时,您就知道自己拥有了什么。

以下 2 个选项为这两个挑战提供了解决方案...

XML - xml 数据类型

您需要考虑要存储的数据。如果您需要返回它并对内容执行复杂的搜索,那么 XML 是您最好的选择。它还允许您验证存储的数据是否与定义的结构匹配(使用 dtd)。见这篇文章。

http://msdn.microsoft.com/en-us/library/ms189887.aspx

或 JSON - nvarchar(max) 数据类型

如果您需要返回此数据以在网页上显示或在 Javascript 中使用,那么存储为 JSON 将是最容易使用的。您可以轻松地将其加载到可以直接使用和操作的对象模型中。缺点是与 XPATH 相比,对数据的复杂搜索会非常慢(遍历所有对象,找到匹配的对象)。

如果您要存储来自其他语言的数据或奇怪的字符,请使用 nvarchar(unicode 版本)。否则 varchar 将是最有效的。

于 2009-11-11T09:44:20.747 回答
0

希望这可以帮助:

datatype=Text
于 2009-11-11T09:32:21.007 回答
0

您可能需要VARCHAR 字段类型

与 CHAR 相比,VARCHAR 值存储为一个字节或两个字节长度的前缀加上数据。

于 2009-11-11T09:31:42.203 回答
0

这些是用作临时表还是实时表?

这是一个我还没有看到的想法,但如果你主要担心尺寸爆炸,但不关心让程序做一些额外的工作,它可能对你有用。但是,我认为最好的做法是使用它们自己的表中的字段创建这些元键(例如,OrderDate),然后你可以有描述、日期等。一个包罗万象的数据库表可能会让人头疼。

创建元表,使用这个想法:

MetaID MetaKey MetaVarchar(255) MetaText MetaDate

varchar、文本和日期可以为空。

让插入程序决定将其放入哪个单元格,数据库调用将只显示任何不为空的字段。短项目将以 varchar 形式显示,长项目以文本形式显示,并且您可以使用日期,以便您可以更改日期的显示方式。

于 2009-11-11T16:32:17.787 回答
0

在 MySQL 中,我通常使用 blob 数据类型,它存储用于网站的动态类的序列化版本。

一个 blob 基本上是二进制数据,所以一旦你弄清楚如何序列化和反序列化数据,你在很大程度上应该是黄金。

请注意,对于大量数据,它的效率确实会降低很多,但它并不需要您更改整个结构。

这是对 blob 数据类型的更好解释:http: //dev.mysql.com/doc/refman/5.0/en/blob.html

于 2009-11-11T17:43:22.540 回答