Как распределить информацию из таблицы импорта в таблицы моделей? - PullRequest
1 голос
/ 25 апреля 2020

Мне нужно создать базу данных, нормализующую некоторые данные, которые я импортировал из CSV-файла. Таблица импорта (таблица ImportA отныне) содержит все данные из модели, такие как: apartment_url, apartment_name, monthly_price, weekly_price, street, country и др. c.

В этой модели, согласно импортированным данным, я хочу создать следующие таблицы: таблица Apartment (будет храниться apartment_url и apartment_name), таблица Price (будет храниться monthly_price и weekly_price и таблица Place (street, country).

3 упомянутых таблицы созданы следующим образом:

Цена стола

создать таблицу Price (серийный номер, ежемесячные деньги, недельные деньги, первичный ключ (id));

Table Place

создать таблицу Place ( id serial, улица varchar (255), страна varchar (255), первичный ключ (id));

Таблица квартир

создать таблицу Apartment (id serial, url varchar (255), имя varchar (255), ссылки на id_price int Цена (id), ссылки id_place int Place (id), первичный ключ (id));

Пример таблицы ImportA данные:

apartment_url    apartment_name    monthly_price    weekly_price     street    country
-----------------------------------------------------------------------------------------

    url1             name1              10               5             a          b
    url2             name2              10               5             c          d
    url3             name3              10               5             a          b
    url4             name4              7                3             x          y

Чтобы нормализовать этот int o в разных таблицах я правильно вставил данные в таблицу Place и таблицу Price следующим образом:

insert into Place (street, country)
select distinct street, country
from ImportA;

insert into Price (monthly, weekly)
select distinct monthly_price, weekly_price
from ImportA;

Итак ...

select * from Place:

id    street     country
--------------------------

1        a          b
2        c          d
3        x          y

select * from Price:

id    monthly     weekly
--------------------------

1        10          5
2        7           3

Проблема в том, что для заполнения таблицы Apartment я не знаю, как связать поля id_price и id_place в соответствии с созданными таблицами ранее.

Следуя примеру данных ImportA и предыдущих таблиц, вывод, который я хочу получить при выполнении select * from Apartment, будет следующим:

    url     name     id_price     id_place
---------------------------------------------------
    url1    name1      1             1
    url2    name2      1             2
    url3    name3      1             1
    url4    name4      2             3

Итак ... как можно Я вставляю данные в таблицу Apartment правильно, используя таблицы ImportA, Place и Price?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Просто используйте join:

select i.url, i.name, p.id, pl.id
from importA i left join
     price p
     on i.monthly = p.monthly and i.weekly = p.weekly left join
     place pl
     on i.street = p.street and i.country = p.country;

Затем вы можете вставить это в свою таблицу apartment.

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

1 голос
/ 25 апреля 2020

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

Наиболее вероятные поля, которые можно использовать в качестве ключа для таблицы ImportA с примером, который вы здесь видите, будут (apartment_url, apartment_name) Хотя в воздухе много вопросов, но нет факта, что (apartment_url, apartment_name) не будет повторяться вдоль таблицы, мы хотим, чтобы нормализованная модель была в третьей нормальной форме, по крайней мере, и мы должны дать последовательный идентификатор для таблицы квартиры. мы могли бы сделать следующее:

Сначала мы создадим таблицу цен с ее ключом, нам нужно будет экспортировать этот ключ в таблицу квартир в качестве основного ключа позже

CREATE TABLE price AS SELECT ROW_NUMBER() OVER(ORDER BY monthly_price, weekly_price) AS id,monthly_price, weekly_price 
                      FROM ImportA 
                      GROUP BY monthly_price, weekly_price;

ожидаемый результат

SELECT * FROM price;
+-----------+----------------------+---------------------+--+
| price.id  | price.monthly_price  | price.weekly_price  |
+-----------+----------------------+---------------------+--+
| 1         | 7                    | 3                   |
| 2         | 10                   | 5                   |
+-----------+----------------------+---------------------+--+

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

CREATE TABLE place AS SELECT ROW_NUMBER() OVER(ORDER BY street, country) AS id, street, country
                      FROM ImportA
                      GROUP BY street, country;

ожидаемый результат

SELECT * FROM place;
+-----------+---------------+----------------+--+
| place.id  | place.street  | place.country  |
+-----------+---------------+----------------+--+
| 1         | a             | b              |
| 2         | c             | d              |
| 3         | x             | y              |
+-----------+---------------+----------------+--+

Теперь мы готовы экспортировать ключи из таблицы цен и размещения в таблицу квартир

CREATE TABLE apartment AS
WITH ap AS(
SELECT ROW_NUMBER() OVER(ORDER BY apartment_url) AS id,
       a.apartment_url AS au,a.apartment_name AS an, a.monthly_price AS mp, 
       a.weekly_price AS wp,street,country, p.id AS id_price
FROM ImportA AS a
JOIN price AS p ON(a.monthly_price = p.monthly_price AND a.weekly_price = p.weekly_price))
SELECT ap.id AS id,au AS apartment_url, an AS apartment_name,mp as monthly_price, wp AS weekly_price, p.street, p.country,id_price, p.id AS id_place
FROM ap
JOIN place AS p ON(ap.street = p.street AND ap.country = p.country);

ожидаемый результат

SELECT * FROM apartment;
+---------------+--------------------------+---------------------------+--------------------------+-------------------------+-------------------+--------------------+---------------------+---------------------+--+
| apartment.id  | apartment.apartment_url  | apartment.apartment_name  | apartment.monthly_price  | apartment.weekly_price  | apartment.street  | apartment.country  | apartment.id_price  | apartment.id_place  |
+---------------+--------------------------+---------------------------+--------------------------+-------------------------+-------------------+--------------------+---------------------+---------------------+--+
| 1             | url1                     | name1                     | 10                       | 5                       | a                 | b                  | 2                   | 1                   |
| 2             | url2                     | name2                     | 10                       | 5                       | c                 | d                  | 2                   | 2                   |
| 3             | url3                     | name3                     | 10                       | 5                       | a                 | b                  | 2                   | 1                   |
| 4             | url4                     | name4                     | 7                        | 3                       | x                 | y                  | 1                   | 3                   |
+---------------+--------------------------+---------------------------+--------------------------+-------------------------+-------------------+--------------------+---------------------+---------------------+--+

Надеюсь, это даст вам некоторые идеи, с уважением .

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