属性可以不是列,而是行记录。
Person表和对象属性表一对多。
类别表和类别属性表一对多。
UPDATE Person SET 类别='金刚' WHERE id=123--插入金刚有而美国大兵没有的属性
INSERT INTO 对象属性表(person_id,属性id,value)
SELECT 123,属性id,默认值
  FROM 类别属性表
 WHERE 类别='金刚'
   AND NOT EXISTS(SELECT *
                     FROM 对象属性表 
                    WHERE person_id = 123
                      AND 属性id = 类别属性表.属性idid)--插入美国大兵有而金刚没有的属性
DELETE 对象属性表 
  WHERE person_id = 123
    AND NOT EXISTS(SELECT *
                     FROM 类别属性表 
                    WHERE 类别='金刚'
                      AND 属性id = 对象属性表.属性idid)