Вопросы по sqlalchemy
Потребности людей ростут, люди устали от статики и хотят больше динамики.
Увы, SQL-based СУБД не созданы для динамических схем. Если ты будешь часто менять схему, то проиграешь в производительности, очень сильно проиграешь. А это ещё при том, что SQL(а тем более с использованием SA) не так и шустр.

Советую обратить внимание на более современные решения — документ-ориентированные бд. Точнее — на MongoDB и MongoKit как средство для создания и манипулирования схемами.
Дело в том, что документ-ориентированные СУБД созданы как-раз для динамических данных, где схема может часто меняться. Документ в такой БД, тоже самое что и запись(строка, row) в SQL-based, в реляционных БД.
Документ представляет из себя JSON-структуру данных, в которой всё можно менять, дополнять, удалять.
У документа нет «схемы». Т.е. захотел сделать документ с постом пользователя, вот и делай:
db.posts.save({id:1, author:«James», text:«Howdy!»})
Однако, схемы бывают нужны, поэтому для них делаются программные решения вроде MongoKit.
Например, можно указать в MongoKit такую схему:
{
name:unicode,
data:{unicode:unicode}
}
Что позволит оперировать словарём data как хочется.
Схема для поста, например:
{
id:int,
author:unicode,
text:unicode
}

В общем, советую почитать:
www.mongodb.org/
namlook.github.com/mongokit/
спасибо, посмотрю в эту сторону, но всё-таки хотелось бы услышать хотя бы по поводу 3го вопроса
ибо если пишу 
class tagged(Base):
 __tablename__ = 'tagged'

 elem = Column(Integer, key='elem')
 tag = Column(Integer, key='tag')

 def __init__(self, elem, tag):
 self.elem = elem
 self.tag = tag

то получаю ответ sqlalchemy.exc.ArgumentError: Mapper Mapper|tagged|tagged could not assemble any primary key columns for mapped table 'tagged'
а делать лишнее поле в таблице не хотелось бы