Нужна помощь в поиске хорошего дизайна и схемы - PullRequest
1 голос
/ 08 марта 2011

Я хочу сделать запрос «все в одном» или даже двухэтапный запрос, извлекаемый из 3 таблиц.

Таблица № 1: Игры - эта таблица содержит тип игры, описание игры и т. Д.

Таблица №2: GameProfiles - содержит идентификатор из таблицы «Игры», поэтому у них обоих есть столбец «GamesId». В этой таблице указаны выигранные игры, проигранные игры и т. Д.

Таблица № 3: Games_WhwhatGame - это не конкретная таблица, есть несколько таблиц, например, если у меня есть игра BasketBall, для нее будет отдельная таблица с именем Games_BasketBall, и в ней есть настраиваемые столбцы в зависимости от игра. Например, баскетбол будет иметь столбец для подборов. Эта таблица будет иметь свой собственный идентификатор первичного ключа.

Я могу легко объединить Games и GameProfiles, используя внутреннее объединение в их общем столбце «GameId», но как мне сделать так, чтобы я также мог извлекать «Games_BasketBall» также в том же запросе, динамически в зависимости от GamesId. Возможно, я неправильно это структурирую, поэтому я открыт для предложений. Мне просто кажется, что я не могу придумать действительно плавный способ заставить эту работу работать правильно, потому что в каждой игре будут разные сущности профиля, поэтому я хочу упростить отношения с каждой таблицей, чтобы можно было получать все в одном запросе.

Этот код имеет запрос БЕЗ отношения к Games_Basketball, я хочу иметь возможность вытащить все это в один читатель, чтобы информация была правильной.

 using (SqlConnection myConnection = new SqlConnection(myConnectionString))
    {

        myConnection.Open();
        String selectSql = "SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId WHERE UserId = @UserId";

        SqlCommand myCommand = new SqlCommand(selectSql, myConnection);
        myCommand.Parameters.AddWithValue("@GameProfile", UserId);


        reader = myCommand.ExecuteReader();
        gameTable.DataSource = reader;
        gameTable.DataBind();
        myConnection.Close();
    }

Ответы [ 3 ]

0 голосов
/ 08 марта 2011

Вы также можете использовать MARS (несколько активных наборов результатов) для достижения своей цели.В MARS вы используете два sqldatareader одновременно.

Вот небольшой пример:

  SqlDataReader rdrone = null;
  SqlDataReader rdrtwo = null;
  string connectionstring = "server=sugandha;initial catalog = Employeedetail;uid = sa;pwd= sa";MultipleActiveResultSets = true;
  SqlConnection con = new SqlConnection(connectionstring);
  SqlCommand cmdone = new SqlCommand("select * from Employee", con);
  SqlCommand cmdtwo = new SqlCommand("select * from Employeedept", con);
  con.Open();
  rdrone = cmdone.ExecuteReader();
  DataTable dtone = new DataTable();
  dtone.Load(rdrone);
  dataGridView1.DataSource = dtone;
  rdrtwo = cmdtwo.ExecuteReader();
  DataTable dttwo = new DataTable();
  dttwo.Load(rdrtwo);
  dataGridView2.DataSource = dttwo;
  con.Close();
0 голосов
/ 08 марта 2011

Если вы хотите получить всю информацию для всех игр одновременно, это не практично делать в одном запросе. И, вы знаете, пользователь не хочет ждать, пока вы, скажем, 135 операций LEFT JOIN, чтобы получить информацию из всех игровых «любых» таблиц.

Так что, хотя это возможно, это не практично, и вы действительно, вероятно, не хотите этого делать в любом случае. Пользователь вряд ли захочет прочитать все эти данные, верно?

Показать только то, что нужно пользователю, именно тогда, когда это нужно пользователю. Если пользователь нажимает «баскетбол», , а затем , вы можете запросить представление, которое уже присоединилось к двум или трем таблицам, которые необходимы для отображения информации об игре «баскетбол».

0 голосов
/ 08 марта 2011

Для твоей нынешней шемы я бы выбрал что-то вроде:

public enum GameType { Basketball, Snooker, ... }

void BindGameData(GameType gameType)
{

[ sql connection code ]

StringBuilder sb = new StringBuilder();
// those constant parts should be stored outside in config file
sb.append("SELECT * FROM aspnet_GameProfiles INNER JOIN aspnet_Games ON aspnet_GameProfiles.GameId = aspnet_Games.GameId "); 
sb.append("INNER JOIN ");
sb.append("aspnet_" + gameType.toString()); // adopt to yours naming pattern
sb.append("ON aspnet_Games.GameId = ");
sb.append("aspnet_" + gameType.toString() + ".GameId");
sb.append("WHERE UserId = @UserId");

String selectSql = sb.toString();

[rest of yours sql connection code]

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...