Как выбрать первичный ключ для данных, которые были изменены, чтобы содержать только уникальные значения - PullRequest
0 голосов
/ 14 апреля 2020

Человек, у меня были проблемы с тем, как произнести название.

  1. Сводка: Для проекта базы данных в универе мы должны импортировать 1 миллион строк данных в базу данных, где каждая строка представляет статью, вырезанную из целого числа. rnet. Один из столбцов в этих данных, является автором статьи. Поскольку многие статьи были написаны одним и тем же автором, я хотел создать отдельную от статей таблицу, в которой каждый уникальный автор связывался бы с первичным ключом, а затем я хотел заменить строку автора в таблице статей на ключ для этого автора. в другой таблице. Как это сделать наиболее эффективным способом и возможно ли сделать это таким образом, чтобы обеспечить детерминированный c вывод, при котором указанная c авторская строка ВСЕГДА отображалась бы на определенный pkey, независимо от порядка строки статей «входят», когда этот метод создает эту таблицу.

  2. То, что я сделал: То, как я это сделал, было (Python с использованием Pandas) go через все 1 миллион строк статей и создать уникальный список всех авторов, которых я нашел. Затем я создал словарь на основе этого списка (отсортировано). Затем я использовал этот словарь для замены строки автора в таблицах статей ключом, соответствующим указанному c автору, а затем использовал dict для создания моей таблицы авторов. Однако, как я понимаю, если в мои данные была вставлена ​​строка, в которой автор не был найден в первый раз, это могло бы испортить алфавитный порядок, в котором мой метод добавляет авторов к требованию, что делает его не таким уж детерминированным. c. Итак, что люди обычно делают в этих случаях? Может ли SQL в статьях 1mio непосредственно создать новую таблицу авторов с уникальными авторами и ключами и заменить строку автора в таблице статей? Может ли быть идея использовать хеширование с указанным ключом c ha sh, чтобы гарантировать, что определенная строка всегда отображается на определенный ключ, или?

  3. Показать некоторые код:

def get_authors_dict():

    authors_lists = []

    df = pd.read_csv("1mio-raw.csv", usecols=['authors'], low_memory=True)

    unique_authors_list = df['authors'].unique()

    num_of_authors = len(unique_authors_list)

    authors_dict = {}
    i = 0
    prog = 0
    for author in unique_authors_list:
        try: 
            authors_dict[author]
            i += 1
        except KeyError:
            authors_dict[author] = i
            i += 1

        print(prog / num_of_authors * 100, "%")
        prog += 1

    return authors_dict

authors_dict = get_authors_dict()

col1_author_id = list(authors_dict.values())
col2_author_name = list(authors_dict.keys())

data_dict = {'col1': col1_author_id,
             'col2': col2_author_name}

df = pd.DataFrame(data=data_dict, columns=['col1', 'col2'])

df.to_csv('author.csv', index=False, header=False, sep="~")

f = open('author.csv', encoding="utf8")

conn = psycopg2.connect(--------)
cur = conn.cursor()
cur.copy_from(f, 'author', sep='~')
conn.commit()
cur.close()

# Processing all the 1mio rows again in seperate file
# and making changes to the dataframe using the dict:
sample_data['authors'] = sample_data['authors'].map(authors_dict)

1 Ответ

0 голосов
/ 15 апреля 2020

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

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

...