首页 > 解决方案 > 如何为已更改为仅包含唯一值的数据选择主键

问题描述

伙计,我是不是不知道如何写标题。

  1. 总结:对于一个uni中的数据库项目,我们需要将100万行数据导入数据库,其中每一行代表从互联网上抓取的一篇文章。此数据中的一列是文章的作者。由于许多文章是由同一作者撰写的,我想创建一个与文章分开的表,将每个唯一作者链接到一个主键,然后我想用该作者的键替换文章表中的作者字符串在另一张桌子上。这是如何以最有效的方式完成的,是否有可能以确保确定性输出的方式完成,因为无论文章行“进入”的顺序如何,特定的作者字符串总是映射到某个 pkey当此方法创建该表时。

    1. 我做了什么:我这样做的方式是(在 Python 中使用 Pandas)遍历所有 100 万篇文章行,并为我找到的所有作者制作一个唯一列表。然后我根据这个列表(排序)创建了一个字典。然后我使用这个字典将文章表中的作者字符串替换为与特定作者对应的键,然后使用该字典创建我的作者表。但是,正如我所看到的,如果在我的数据中插入了一行而第一次没有找到作者,它可能会混淆我的方法将作者添加到字典中的字母顺序,从而使其不那么确定. 那么,在这些情况下,人们通常会做什么呢?1mio文章上的SQL能否直接新建一个authors和keys唯一的authors表,并替换文章表中的作者字符串?是否可以使用带有特定哈希键的哈希来确保某个字符串始终映射到某个键,或者?

    2. 显示一些代码:

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)

标签: pythonsqldatabasepandasentity-relationship

解决方案


因此,如果我对您的理解正确,您想创建一个将作者与文章联系起来的 SQL 表。您的问题是,您不知道应该在这样的表中使用什么主键,因为作者可能写过不止一篇文章。

在这种情况下,我不会尝试做一些聪明的事情,而是为您的表使用复合主键。这意味着您将与文章的标题/发布日期/标识符相关的作者行定义为表的主键。因此,表的每一行都有一个唯一标识符(如果没有作者写过两篇相同的文章)。这与您的 python 代码无关,因为这需要在数据库中定义。 这个问题可能会帮助您定义复合主键。


推荐阅读