mysql - 用于嵌入系统的表设计

时间:2009-12-01 16:29:16

标签: mysql database database-design

我正在我网站上的一个嵌入部分,用户可以从各种服务,youtube,myspace音乐,vimeo等嵌入不同的媒体

我正在尝试找出存储它的最佳方法。用户不必嵌入所有选项,只能嵌入每种类型中的一种(例如一个视频)。

最初,我认为每个嵌入项目都有一个表格,如下所示:

  • embedid(自动增量主键),
    userid,embedded_item_id(例如a youtube id)

然后我意识到一些可嵌入的项目需要多个参数,例如myspace音乐,所以我认为id会创建一个表,每个用户都有一行。

  • userid,youtubeid,vimeoid,
    myspaceid1,myspaceid2

但它似乎有点笨拙,特别是考虑到总是会有空行,因为用户无法拥有所有这些行。有没有人有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

  • `EmbededItem'表包含所有项目共有的列。
  • YouTubeVimeoMySpace仅包含特定于每个列的列。

    embededitem_model_01

答案 1 :(得分:0)

所以,这就是我在这种情况下所做的事情: 使用主键和用户ID字段以及识别用户或应用程序所需的任何其他内容(可能是“mediatype”字段)设置表格。其余的,放入VARCHAR字段,使其足够大以容纳大量数据。不确定你需要多少空间,但我猜想你需要1K到4K +的空间。

VARCHAR字段的原因:您永远不会知道将来需要的其他新字段。让我们说明年youtube会添加另一个参数,或者出现新的媒体格式。如果您对数据库建模以单独表示所有字段,则将创建一个无法扩展到未来或其他媒体格式的应用程序。当您在纸上描述系统时,这种建模很有用,但在实现代码时却不太好。

所以,既然你有一个varchar字段来存储你的所有数据,你有几个选项来存储数据:

  1. 您可以将数据存储为XML文档并在输入/输出上进行解析(但您很可能需要超过4k的空间),并且会产生解析XML的成本。

  2. 您可以将数据存储为应用程序可能需要的任何数据格式(java的序列化对象,javascript的JSON等)。如果要序列化对象,则可能还需要4k以上的空间和VARBINARY字段,而不是VARCHAR。

  3. 以逗号分隔的字符串,但如果您的字符串包含逗号,则会失败。我可能不会推荐这个。

  4. null分隔的键/值对字符串,末尾带有double null。您将需要一个VARBINARY数据字段。

  5. 4号是我的最爱,也是我推荐的。我已将此模式用于现有的Web项目,其中我的字符串以以下格式存储:

    'uid=userid/0var1=value1/0val2=value2/0url=urltosite/0/0'
    

    像魅力一样工作。我使用这些数据为我的用户构建动态网页。 (我的应用程序是C,因此它可以很好地解析字符数组。)

    您的应用程序可以使用第一列中的数据(如“mediatype”)执行特定的解析例程(如果需要),并使用VARCHAR / VARBINARY字段作为输入。扩展到新类型的可嵌入媒体就像编写新的(或扩展现有的)解析器并定义新的“mediatype”值一样简单。

    希望这有帮助。