2009-10-21 5 views
1

Мы создаем набор функций для нашего приложения. Одним из них является список недавних действий пользователя ala on SO. У меня возникла небольшая проблема с поиском наилучшего способа разработки таблицы для этих действий.Список мероприятий ala SO

В настоящее время у нас есть таблица упражнения со следующими столбцами

 
UserId (Id of the user the activity is for) 
Type (Type of activity - i.e. PostedInForum, RepliedInForum, WroteOnWall - it's a tinyint with values taken from an enumerator in C#) 
TargetObjectId (An id of the target of the activity. For PostedInForum this will be the Post ID, for WroteOnWall this will be the ID of the User whose wall was written on) 
CreatedAtUtc (Creationdate) 

Моя проблема заключается в том, что колонка TargetObjectId не чувствует себя хорошо. Это мягкая ссылка - никаких внешних ключей, и только знание о типе говорит вам, что этот столбец действительно содержит.

Есть ли у вас какие-либо предложения по альтернативному/лучшему способу хранения списка пользовательских действий?

Следует также упомянуть, что сайт будет многоязычным, поэтому вы должны иметь возможность просматривать список действий на разных языках - вот почему мы не выбрали, например, просто поместить текст мероприятия/html в Таблица.

Благодаря

ответ

0

Вы можете проверить http://activitystrea.ms/ для вдохновения, особенно схемы определение. Если вы посмотрите на эту спецификацию, вы увидите, что существует также концепция объекта «Цель». Недавно я сделал что-то очень похожее, но мне пришлось создать свою собственную базу данных для инкапсуляции всех данных активности и подачи данных в нее, потому что я собирал данные активности из нескольких приложений с разрозненными источниками данных в разных базах данных.

Макс.

1

Вы можете поместить все содержимое в одну таблицу со столбцом дискриминатора, а затем просто select top 20 ... from ... order by CreatedAtUtc desc.

В качестве альтернативы, если вы храните различные типы контента в различных таблицах, вы можете попробовать что-то вроде (не уверен насчет точного синтаксиса):

select top 20 from (
    select top 20 ID, CreatedAtUtc, 'PostedToForum' from ForumPosts order by CreatedAtUtc 
    union all 
    select top 20 ID, CreatedAtUtc, 'WroteOnWalll' from WallPosts order by CreatedAtUtc) t 
order by t.CreatedAtUtc desc 
+0

Я подумал об этом, но меня мало волнует масштабируемость. Сейчас у нас есть около 6-7 различных видов деятельности, поэтому нам нужно будет использовать данные из 6-7 таблиц, но в будущем это может увеличиться до 20 или 30 различных видов деятельности. – Micael

Смежные вопросы