Моделирование данных для страны, региона, города - PullRequest
0 голосов
/ 13 марта 2012

Я хочу создать структуру данных для использования в моем приложении MVC3. На сайте хранятся видео, загруженные пользователями, я хочу иметь возможность указать место для видео, чтобы позже можно было выполнять поиск по стране, региону или городу.

Моделирование этих объектов не является для меня большой проблемой, мой вопрос в том, какой атрибут класса я должен использовать для моего видео объекта.

public class Country
{
 int CountryId
 string CountryName
}

public class Region
{
 int RegionId
 string RegionName
 int FK_CountryId
}

public class City
{
 int CityId
 string CityName
int FK_CountryId
int FK_RegionId
}

........

public class Video
{
int VideoId;
string VideoName;
**Location VideoLocation;**
}

**public class Location
{
int LocationId;
Country CountrId;
Region RegionId;
City CityId;
}**

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

Что вы думаете о хорошем дизайне и производительности?

1 Ответ

0 голосов
/ 13 марта 2012

Наверное, это кошмар каждого.Ну ... по крайней мере, это был мой кошмар при разработке одного из приложений.

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

Примером такого подхода будет:

public class Country
{
    public string Code { get; set; } //country ID would not make sense in this approach
    public string Name { get; set; }
}

public class Region
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string CountryCode { get; set; } //1 region is assigned to only 1 country
}

public class City
{
    public string Code { get; set; }
    public string Name { get; set; }
    public string RegionCode { get; set; } //1 city is assigned to only 1 region
}

Выглядит хорошо, просто для понимания, но подумайте о таблице, где вы фиксируете то, что было выбрано.Если вам небезразличен только город (последний элемент в списке зависимостей), все понятно и понятно.

public class UserSelectionWithCityOnly
{
    public string CityCode { get; set; }
}

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

public class UserSelectionWithEitherSelected
{
    public string? CityCode { get; set; }
    public string? RegionCode { get; set; }
    public string? CountryCode { get; set; }
}

хорошо ... вы всегда можете проверить, если CityCode.HasValue, но с точки зрения БДэто было бы пустое поле, которое может добавить грязные данные (должно быть хорошо, если вы не педантично относитесь к чистоте и чистоте БД)

Таким образом, я решил это путем создания одной иерархической таблицы с идентификатором родительского элемента:

public class MySolutionForDestinations
{
    public int DestinationId { get; set; } //primary key
    public int ParentDestinationId { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public DestinationLevel Level { get; set; }
}

public enum DestinationLevel
{
    Country = 0,
    Region = 1,
    City = 2
}

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

Надеюсь, это будет полезно

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