Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌入式系统的mysql表设计_Mysql_Database_Database Design - Fatal编程技术网

嵌入式系统的mysql表设计

嵌入式系统的mysql表设计,mysql,database,database-design,Mysql,Database,Database Design,我正在我的网站上做一个嵌入部分,用户可以在其中嵌入来自各种服务的不同媒体,如youtube、myspace music、vimeo等 我正在努力找出最好的储存方法。用户不必嵌入所有选项,只能嵌入每种类型中的一种(例如一个视频) 最初,我认为只需要一个表,每个嵌入项有一行,如下所示: 嵌入ID(自动递增主键), 用户id、嵌入的\u项\u id(例如 youtube id) 但后来我意识到一些可嵌入的项目需要多个参数,比如myspace music,所以我想我应该在每个用户有一行的地方制作一个

我正在我的网站上做一个嵌入部分,用户可以在其中嵌入来自各种服务的不同媒体,如youtube、myspace music、vimeo等

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

最初,我认为只需要一个表,每个嵌入项有一行,如下所示:

  • 嵌入ID(自动递增主键),
    用户id、嵌入的\u项\u id(例如 youtube id)
但后来我意识到一些可嵌入的项目需要多个参数,比如myspace music,所以我想我应该在每个用户有一行的地方制作一个表

  • userid、youtubeid、vimeoid,
    myspaceid1,myspaceid2
但这似乎有点笨拙,尤其是考虑到总是会有空行,因为用户永远无法拥有所有空行。有谁有更好的解决方案吗?

  • `“EmbeddedItem”表具有所有项共有的列
  • YouTube
    Vimeo
    MySpace
    只有特定于每个栏目的栏目。


    • 因此,在这种情况下,我会做以下几点: 使用主键和用户ID字段的列以及标识用户或应用程序所需的任何其他内容(可能是“mediatype”字段)设置表。其余的放在VARCHAR字段中,使其足够大以容纳大量数据。不确定您需要多少空间,但我想大胆猜测一下,您将需要1K到4K+的空间

      使用VARCHAR字段的原因:您永远不知道将来还需要哪些新字段。假设明年youtube增加了另一个参数,或者出现了一种新的媒体格式。如果将数据库建模为单独表示所有字段,则将创建一个不可扩展到未来或其他媒体格式的应用程序。当您在纸上描述系统时,这种建模非常好,但当您实现代码时,这种建模就不那么好了

      因此,现在您有了一个varchar字段来存储所有数据,您有几个选项来存储数据:

    • 您可以将数据存储为XML文档,并在输入/输出时对其进行解析(但很可能需要超过4k的空间),并且您将承担解析XML的成本

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

    • 逗号分隔的字符串,但如果字符串包含逗号,则此操作将失败。我可能不会推荐这个

    • 以null分隔的键/值对字符串,结尾为双null。这一个需要一个VARBINARY数据字段

    • 4号是我最喜欢的,我想推荐一下。我在现有的web项目中使用了此模式,其中我的字符串以以下格式存储:

      'uid=userid/0var1=value1/0val2=value2/0url=urltosite/0/0'
      
      工作起来很有魅力。我使用这些数据为我的用户构建动态网页。(但我的应用程序是C,因此它能够很好地解析字符数组)

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


      希望这有帮助。

      哇。。。没想到会有一张照片。。。嗯,是的,很有道理。。。非常相关:)为什么不为所有唯一ID创建一个表,并为不同的服务名称创建一个映射表呢。通过这种设置,每次您想要添加对新服务的支持时,都必须添加一个新表。使用映射表,您只需添加一个新行。@Tom,这里的前提是每个服务都有一个或多个其他服务没有的特定列。如果他们都只有id,
      EmbeddedItem
      表就足够了。@Damir,我真的很喜欢这个系统,一个问题。。。你会推荐类型为“youtube”吗,因为它在技术上是一个id,因此会重复很多次。。。我是否应该使其与类型表相对?还是我在感情上被冲昏头脑了。。。导致数以百万计的联接和低效查询?所有公共字段都应放入
      embeddeditems
      表中;前提是它们(适合)相同的数据类型。类型分类器可能类似于
      Y、M、V、…
      。如果一个表只有一个ID,您可以使用基于
      类型的视图来伪造它。
      例如,如果MySpace和Vimeo表有一些特定的列,但YouTube只有一个ID,只需创建一个
      YouTube视图来“伪造”一个表即可。