【问题标题】:mysql - table design for embeding systemmysql - 嵌入系统的表设计
【发布时间】:2017-01-20 18:39:56
【问题描述】:

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

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

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

  • 嵌入(自动递增主键),
    userid、embedded_item_id(例如 youtube id)

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

  • 用户 ID、youtubeid、vimeoid、
    我的空间 ID1,我的空间 ID2

但这似乎有点笨拙,尤其是考虑到总会有空行,因为用户不可能拥有所有行。谁有更好的解决方案?

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:
    • `EmbededItem' 表具有所有项目共有的列。
    • YouTubeVimeoMySpace 仅具有特定于每一列的列。

    【讨论】:

    • 哇...没想到会有一张照片...嗯,你说得很有道理...非常相关:)
    • 为什么不为所有唯一 ID 提供一个表,并为不同的服务名称提供一个映射表。使用此设置,您每次想要添加对新服务的支持时都必须添加一个新表。使用映射表,您只需添加一个新行。
    • @Tom,这里的前提是每个服务都有一个或多个其他服务没有的特定列。如果他们都只有 id,EmbeddedItem 表就足够了。
    • @Damir,我真的很喜欢这个系统,一个问题...您是否建议将类型设为“youtube”,因为它在技术上是一个 ID,因此会重复很多次...我应该不相对于类型表?或者我是否因为关系而忘乎所以......导致数百万个连接和低效查询?
    • 所有常用字段都应该进入EmbededItems表;前提是它们(适合)相同的数据类型。类型分类器可能类似于Y,M,V,..。如果一个表只有一个 ID,您可以使用基于 Type. 的视图来伪造它一张桌子。
    【解决方案2】:

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

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

    所以,既然您有一个 varchar 字段来存储您的所有数据,那么对于如何存储数据,您有多种选择:

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

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

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

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

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

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多