0

假设我有一个类似对象的数据记录,如下所示:

$article = array(
    'title' => '',
    'tagline' => '',
    'content' => '',
    'stats' => array(
        'words' => 0,
        'paragraphs' => 0,
        'tables' => 0
    ),
    'references' => array(
        'reference 1',
        'reference 2',
        'reference 3'
    ),
    'attachments' => array(
        'images' => array(
            'image 1',
            'image s'
        ),
        'videos' => array(
            'video 1',
            'video 2'
        )
    )
);

我的问题是如何将这组数据记录存储在关系数据库中?我应该如何设计表结构?

我知道我总是可以设置平面字段,例如 stats_words、stats_paragraphs 等等,但是还有更多的结构化方法吗?而不是将 JSON 或序列化字符串存储在单个字段中......

谢谢!

4

1 回答 1

0

例如这种方式:

article
  ID
  title _
  tagline _
  content ___
  stat_words
  stat_paragraphs
  stat_tables

article_reference
  ID
  article_id -> article
  reference _

article_attachment
  ID
  article_id -> article
  att_type // image or video
  path _
  title _

_表示 varchar/text 字段,其他字段为数字)

或者作为 MySQL DDL:

CREATE TABLE IF NOT EXISTS article (
   id               INT NOT NULL AUTO_INCREMENT,
   title            VARCHAR(255) NOT NULL,
   tagline          VARCHAR(255) NOT NULL,
   content          MEDIUMTEXT NOT NULL,
   stat_words       INT NOT NULL,
   stat_paragraphs  INT NOT NULL,
   stat_tables      INT NOT NULL,
   PRIMARY KEY ( id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS article_reference (
   id               INT NOT NULL AUTO_INCREMENT,
   article_id       INT NOT NULL,
   reference        VARCHAR(255) NOT NULL,
   PRIMARY KEY ( id ),
   FOREIGN KEY ( article_id ) REFERENCES article( id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS article_attachment (
   id               INT NOT NULL AUTO_INCREMENT,
   article_id       INT NOT NULL,
   att_type         INT NOT NULL,
   path             VARCHAR(255) NOT NULL,
   title            VARCHAR(255) NOT NULL,
   PRIMARY KEY ( id ),
   FOREIGN KEY ( article_id ) REFERENCES article( id )
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
于 2012-07-02T11:08:57.513 回答