создание базы данных для получения сведений о городе из нескольких веб-сервисов

Я работаю над приложением для путешествий, поэтому нам приходится иметь дело с различными веб-сервисами, такими как GTA, Gallileo, Kuoni и т. Д. для получения информации о деталях отеля. Каждый веб-сервис имеет свой собственный код города и название города. Я хочу создать таблицу для хранения данных о городе из разных веб-сервисов, после некоторых исследований я пришел к этим двум подходам

1-й подход

CREATE TABLE [dbo].[City](
[CityID] [int] NOT NULL,
[CountryCode] [varchar](5) NOT NULL,
[AppCityCode] [varchar](10) NOT NULL,
[AppCityName] [varchar](200) NOT NULL,
[GTACityCode] [varchar](10) NULL,
[GTACityName] [varchar](200) NULL,
[GWSCityCode] [varchar](10) NULL,
[GWSCityName] [varchar](200) NULL,
[KuoniCityCode] [varchar](10) NULL,
....
....
....
....
....
....
)

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

Второй подход Таблица WSSupplier используется для хранения данных Webservice, таких как GTA, Gallileo ..

CREATE TABLE [dbo].[WSSupplier](
[SupplierID] [smallint] NOT NULL,
[SupplierName] [varchar](100) NOT NULL
)

CREATE TABLE [dbo].[City](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[AppCityCode] [varchar](20) NULL,
[AppCityName] [varchar](150) NULL,
[CountryCode] [varchar](10) NULL,
[WSSupplierID] [smallint] NULL,
[WSCityCode] [varchar](20) NULL,
[WSCityName] [varchar](150) NULL
)

Во втором подходе города будут добавляться последовательно за строкой с соответствующим идентификатором поставщика веб-сервисов Если появится новый веб-сервис, мне не нужно изменять структуру таблицы или внешнее приложение. При загрузке городов я должен использовать DISTINCT для загрузки уникального города в текстовое поле или выпадающего списка в интерфейсе

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

Я хочу знать, какой из них будет лучшим, или если есть другой хороший подход

1

2 ответы

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

У вашего городского стола будет только идентификатор города вашей системы. Город появится только один раз. Каждый раз, когда вы добавляете поставщика, вы вставляете новые записи в таблицу пересечений с кодами городов для городов, о которых заботится поставщик. Перевод кода города поставщика на ваш внутренний код города - это простой поиск в таблице пересечений.

Рассмотрим что-то вроде этого:

CREATE TABLE [dbo].[WSSupplier](
[SupplierID] [smallint] NOT NULL,
[SupplierName] [varchar](100) NOT NULL
)

CREATE TABLE [dbo].[City](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[CityCode] [varchar](20) NULL,
[CityName] [varchar](150) NULL,
[CountryCode] [varchar](10) NULL
)

CREATE TABLE [dbo].[SupplierCityCode](
[CityID] [int] NOT NULL,
[WSSupplierID] [smallint] NULL,
[WSCityCode] [varchar](20) NULL,
[WSCityName] [varchar](150) NULL,
FOREIGN KEY [fk_city] [CityID] REFERENCES [dbo].[City],
FOREIGN KEY [fk_supplier] [WSSupplierID] REFERENCES [dbo].[WSSupplier]
)
2
добавлено
@ SQL006. Если вы определили ссылки на внешние ключи, вы фактически не сможете перенести данные в таблицу пересечений сначала без соответствующего города. Если вы ищете способ выяснить, какие города в таблице пересечений не отображаются в родительской таблице, вы должны Google SQL WHERE NOT IN SUBSELECT или посмотреть на этот KB: msdn.microsoft.com/en-us/library/ms189062 (v = sql.105) .aspx
добавлено автор Joel Brown, источник
Спасибо за ответ..
добавлено автор SQL006, источник
еще один вопрос, который я хочу задать, - я добавил 10 городов в таблицу City (App). Когда я получаю список городов от поставщика, у них около 100 городов ... так что 90 городов разные, а 10 - общие с моими Город приложения. Я извлек данные из города поставщика xml и загрузился в таблицу двумя столбцами CityCode и cityname .. Теперь я хочу вставить данные в таблицу City и таблицу SupplierCity.
добавлено автор SQL006, источник

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

CREATE TABLE [dbo].[Supplier](
[SupplierID] [smallint] NOT NULL,
[SupplierName] [varchar](100) NOT NULL
)

CREATE TABLE [dbo].[AppCity](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[CityCode] [varchar](20) NULL,
[CityName] [varchar](150) NULL,
[CountryCode] [varchar](10) NULL,
)

CREATE TABLE [dbo].[SupplierCity](
[CityID] [int] IDENTITY(1,1) NOT NULL,
[SupplierID] [smallint] NOT NULL,
[CityCode] [varchar](20) NULL,
[CityName] [varchar](150) NULL
)
0
добавлено
Спасибо за ответ ..
добавлено автор SQL006, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

dbGeeks
dbGeeks
545 участник(ов)

Чат про базы данных, их устройство и приемы работы с ними. Разрешаются любые адеватные дискуссии в рамках тематики чата.

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Разработка СУБД
Разработка СУБД
143 участник(ов)