2009-11-11 92 views
2

我想创建包含动态数据的表,它可以在一个日期,布尔或例如文本文章对元数据的Mysql字段大小

形式:

meta_key =“ isActive” meta_valu = “1”

meta_key = “theDate” meta_value = “星期六年07月23 2时16分57秒2005”

meta_key =“说明” meta_value =“这是一个描述,这个文本可以继续下去,所以我需要一个很长田”

的问题是meta_value应该是为了什么类型的字段不膨胀DB太多插入每一个“1”,哪些字段是动态的,只会消耗自己的长度

希望我是清楚的空间...

回答

0

你可能想的VARCHAR field type

与CHAR相反,VARCHAR值存储为单字节或双字节长度前缀加数据。

+0

所以生病只是定义meta_value作为一个巨大的varchar,而只是确保用户输入不超过该字段的最大高? – tridat 2009-11-11 09:36:56

+0

这会工作,是的,除非你想在那里超过65535字节。如果你这样做,那么@Treby建议的TEXT(最多4GB)会起作用(但可能会导致问题,请参阅http://dev.mysql.com/doc/refman/5.0/en/blob.html) – rjp 2009-11-11 10:11:34

+0

我认为VARCHAR实际上使用更多的空间(一个或两个字节的前缀)。它的内容仍然嵌入在行数据中(与行中包含引用的TEXT类型字段相对),因此将使用最大存储空间长度。 – 2009-11-11 14:30:31

0

希望这有助于:

datatype=Text 
1

我只会用非结构化的数据模型,怎么样,你建议,如果你存储非结构化数据或文件(例如FriendFeed的)。

替代存储的想法

有比SQL服务器的非结构化数据有更多合适的数据存储系统。我建议将其中的一个与现有的结构化数据库结合使用。

SQL选项

如果你不能做到这一点,必须保存在你的SQL数据库的非结构化数据,你有几个选项,数据类型是不是真的是唯一的关注,您的数据是如何存储的是。

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

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

以下2个选项提供了解决这两个难题......

XML - XML数据类型

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

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

或JSON - 为nvarchar(最大)数据类型

如果您需要为显示屏返回网页上的这些数据,或者使用在JavaScript,然后保存为JSON将是最简单的工作用。您可以轻松将其加载到可直接操作并可操作的对象模型中。缺点是与XPATH相比,对数据的复杂搜索将非常缓慢(遍历所有对象,找到匹配的对象)。

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

+0

我知道,我不确定“做一个完全不同的方式”是否有帮助。“无模式”表格是存储灵活数据的一种相当常见的方式,并且可以很好地工作(请参阅FriendFeed,例如:http://bret.appspot.com/entry/how-friendfeed-uses-mysql) – rjp 2009-11-11 14:54:59

+1

完全取决于你的情况,friendfeed是一个非常具体的应用程序,他们以这种方式使用它,因为它们的数据是非结构化的。如果您要存储非结构化数据,请查看CouchDB(文档存储),BigTable(只是一个大表!)或Lucine以及文件系统。我想说一个关系数据库并不是你为此所需要的。 – badbod99 2009-11-11 17:09:26

+0

+1我特别喜欢使用Lucene来为一组平面文件建立索引的想法,它是一种非常好的解决方案,可以很容易地将“无模式”数据纳入关系范式。 – 2009-11-11 20:45:16

0

这些被用作临时表或实时表吗?

这里有一个想法我还没有看到,但可以为你工作,如果你主要担心尺寸爆炸,但不关心让程序做一些额外的工作。不过,我相信最好的做法是在自己的表中创建这些带有字段的元键(例如,OrderDate),然后就可以得到描述,日期等。一个查询表数据库表可能会让人头痛不已。

创建的元表,用这样的观念:

MetaID MetaKey MetaVarchar(255) MetaText 沿革资料

VARCHAR,文本和日期可以为空。

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

0

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

blob基本上是二进制数据,所以一旦你弄清楚如何序列化和反序列化数据,你应该在大多数情况下都是黄金的。

请注意,对于大量数据来说,效率会降低很多,但它不会要求您更改整个结构。

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