def build_markdown_table(headers, rows, row_keys=None):
    row_maxes = _find_row_maxes(headers, rows)
    row_keys = row_keys or [key for key, value in headers.items()]
    table = [
        _build_row(headers, row_maxes, row_keys),
        _build_separator(row_maxes, row_keys)
    ]
    for row in rows:
        table.append(_build_row(row, row_maxes, row_keys))
    return '\n'.join(table) + '\n'